Как подсчитать символы, слова и строки в файле, используя Perl?

Ваши обработчики событий теряются при замене содержимого. Когда вы устанавливаете события hover, jQuery устанавливает их в событиях на странице в настоящее время. Поэтому, когда вы заменяете их на ajax, события не связаны с этими элементами, потому что они новы.

Чтобы исправить это, вы можете либо вызвать функцию, которая их связывает, либо вместо этого вы можете установить обработчик событий документ, как в этом ответе , используя $ (document) .on

Таким образом, событие устанавливается в документе, и любые новые элементы получат вызванное событие.

16
задан brian d foy 24 April 2009 в 19:09
поделиться

8 ответов

Вот код perl. Подсчет слов может быть несколько субъективным, но я просто говорю, что любая строка символов не является пробелом.

open(FILE, "<file.txt") or die "Could not open file: $!";

my ($lines, $words, $chars) = (0,0,0);

while (<FILE>) {
    $lines++;
    $chars += length($_);
    $words += scalar(split(/\s+/, $_));
}

print("lines=$lines words=$words chars=$chars\n");
25
ответ дан 30 November 2019 в 10:59
поделиться

Вариант ответа bmdhacks, который, вероятно, даст лучшие результаты, заключается в использовании \ s + (или даже лучше \ W +) в качестве разделителя. Рассмотрим строку «Быстрая коричневая лиса» (дополнительные пробелы, если это не очевидно). Использование разделителя из одного символа пробела даст количество слов шесть, а не четыре. Итак, попробуйте:

open(FILE, "<file.txt") or die "Could not open file: $!";

my ($lines, $words, $chars) = (0,0,0);

while (<FILE>) {
    $lines++;
    $chars += length($_);
    $words += scalar(split(/\W+/, $_));
}

print("lines=$lines words=$words chars=$chars\n");

Использование \ W + в качестве разделителя остановит пунктуацию (среди прочего) в качестве слов.

7
ответ дан 30 November 2019 в 10:59
поделиться

Инструмент подсчета слов подсчитывает символы, слова и строки в текстовых файлах

4
ответ дан 30 November 2019 в 10:59
поделиться

There is the Perl Power Tools project whose goal is to reconstruct all the Unix bin utilities, primarily for those on operating systems deprived of Unix. Yes, they did wc. The implementation is overkill, but it is POSIX compliant.

It gets a little ridiculous when you look at the GNU compliant implementation of true.

2
ответ дан 30 November 2019 в 10:59
поделиться

Несерьезный ответ:

system("wc foo");
1
ответ дан 30 November 2019 в 10:59
поделиться

Reading the file in fixed-size chunks may be more efficient than reading line-by-line. The wc binary does this.

#!/usr/bin/env perl

use constant BLOCK_SIZE => 16384;

for my $file (@ARGV) {
    open my $fh, '<', $file or do {
        warn "couldn't open $file: $!\n";
        continue;
    };

    my ($chars, $words, $lines) = (0, 0, 0);

    my ($new_word, $new_line);
    while ((my $size = sysread $fh, local $_, BLOCK_SIZE) > 0) {
        $chars += $size;
        $words += /\s+/g;
        $words-- if $new_word && /\A\s/;
        $lines += () = /\n/g;

        $new_word = /\s\Z/;
        $new_line = /\n\Z/;
    }
    $lines-- if $new_line;

    print "\t$lines\t$words\t$chars\t$file\n";
}
1
ответ дан 30 November 2019 в 10:59
поделиться

Чтобы иметь возможность считать CHARS, а не байты, рассмотрим следующее:
(Попробуйте это с китайскими или кириллическими буквами и файлом, сохраненным в utf8)

use utf8;

my $file='file.txt';
my $LAYER = ':encoding(UTF-8)';
open( my $fh, '<', $file )
  || die( "$file couldn't be opened: $!" );
binmode( $fh, $LAYER );
read $fh, my $txt, -s $file;
close $fh;

print length $txt,$/;
use bytes;
print length $txt,$/;
1
ответ дан 30 November 2019 в 10:59
поделиться

Я наткнулся на это, когда искал решение для подсчета символов. По общему признанию, я почти ничего не знаю о perl, поэтому некоторые из этих сведений могут быть не совсем правильными, но вот мои настройки решения newt.

Во-первых, в любом случае есть встроенная переменная количества строк, поэтому я просто использовал ее. Это, вероятно, немного более эффективно, я думаю. Как бы то ни было, количество символов включает символы новой строки, что, вероятно, не то, что вам нужно, поэтому я проглотил $_. Perl также жаловался на то, как выполняется split() (неявное разделение, см.: Почему Perl жалуется: «Использование неявного разделения на @_ устарело»? ), поэтому я подправил это. Мои входные файлы имеют кодировку UTF-8, поэтому я открыл их как таковые. Это, вероятно, помогает получить правильное количество символов во входном файле, содержащем символы, отличные от ASCII.

Вот код:

open(FILE, "<:encoding(UTF-8)", "file.txt") or die "Could not open file: $!";

my ($lines, $words, $chars) = (0,0,0);
my @wordcounter;
while (<FILE>) {
    chomp($_);
    $chars += length($_);
    @wordcounter = split(/\W+/, $_);
    $words += @wordcounter;
}
$lines = $.;
close FILE;
print "\nlines=$lines, words=$words, chars=$chars\n";
2
ответ дан 30 November 2019 в 10:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: