пытаясь посчитать charcters в строке в Perl и не удалось - PullRequest
1 голос
/ 01 мая 2011

В начале я просто использовал следующее для подсчета длины каждой строки:

while(<FH>){
    chomp;
    $length=length($_);
}

но когда я сравнил результат, полученный с помощью команды linux WC, я обнаружил проблему: все символы табуляции в моем файле обрабатываются как длина 1 character в perl, тогда как 8 для wc, поэтому я сделал следующую модификацию:

while(<FH>){
    chomp;
    my $length=length($_);
    my $tabCount= tr/\t/\t/;
    my $lineLength=$wc-$tabCount+($tabCount*8);
}

для приведенного выше кода он работает во всех большинстве случаев, кроме одного, в wc учитываются не все вкладки, а только та, которая не была взята с некоторыми символами, например, если на В начале строки я набираю 1234, а затем нажимаю вкладку, в wc она не считается вкладкой, но приведенный выше код учитывает, есть ли какие-либо способы, которые я мог бы использовать для решения этой проблемы? Спасибо

Решил, использовал Расширение вкладки , вот код:

1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
$length=length($string);

Если бы кто-нибудь мог дать ему объяснение, это было бы замечательно, я проверил его на работоспособность, но не совсем понял. В любом случае, спасибо за помощь

Ответы [ 3 ]

8 голосов
/ 01 мая 2011

Я не думаю, что вкладки - это ваша проблема, wc не считает вкладку восемью символами. Я думаю, что ваша проблема в том, что вы удаляете EOL, но wc считает их. Кроме того, вы не накапливаете длины, вы просто отслеживаете длину последней строки. Это:

while(<FH>){
    chomp;
    $length=length($_);
}

Должно быть так:

my $length = 0;
while(<FH>) {
    $length += length($_);
}
# $length now has the total number of characters
1 голос
/ 13 мая 2011

Решил, использовал Расширение вкладки , вот код:

1 while $string =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e;
$length=length($string);

если кто-нибудь сможет дать ему объяснение, это было бы здорово, я проверил, что он работает,но не совсем понимаюВ любом случае, спасибо за помощь

0 голосов
/ 01 мая 2011

Как насчет просто вызова wc из perl?

$result = `wc -l /path/to/file`
...