1

最初は、以下を使用して各行の長さを数えました。

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

しかし、得られた結果をLinuxコマンドWCによって生成された結果と比較すると、問題が見つかりました。ファイル内のすべてのタブ文字が1 characterperlの長さとして扱われるのに対し、それは8のためのものであるwcため、次の変更を行いました。

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

上記のコードでは、1つを除いて、現在ほとんどすべてのケースで機能します。wcすべてのタブがカウントされるわけではありませんが、一部の文字が含まれていないものだけがカウントされます。たとえば、行の先頭にある場合は、入力して1234からタブを押すと、タブwcとしてカウントされませんが、上記のコードはそれをカウントしましたが、この問題を解決するために採用できる方法はありますか?ありがとう

それを解決し、タブ拡張を使用しました、ここにコードがあります:

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

誰かがそれを説明することができれば、それは素晴らしいでしょう、私はそれが機能していることをテストしましたが、それを完全には理解していません。とにかく、すべての助けに感謝します

4

3 に答える 3

8

タブが問題になるとは思いません。wcはタブを8文字としてカウントしません。あなたの問題はあなたがEOLを取り除いているということだと思いますが、wcはそれらを数えます。また、長さを累積しているのではなく、最後の行の長さを追跡しているだけです。これ:

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

このようにする必要があります:

my $length = 0;
while(<FH>) {
    $length += length($_);
}
# $length now has the total number of characters
于 2011-04-30T21:55:56.423 に答える
1

それを解決し、タブ拡張を使用しました、ここにコードがあります:

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

誰かがそれを説明することができれば、それは素晴らしいでしょう、私はそれが機能していることをテストしましたが、それを完全には理解していません。とにかく、すべての助けに感謝します

于 2011-05-13T14:40:10.647 に答える
0

perl内からwcを呼び出すのはどうですか?

$result = `wc -l /path/to/file`
于 2011-04-30T21:29:13.187 に答える