1

一开始我只是简单地用下面的方法来计算每一行的长度:

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

但是当我将得到的结果与linux命令WC产生的结果进行比较时,我发现了一个问题:我文件中的所有制表符1 character在perl中都被视为长度,而它是8for wc,所以我做了以下修改:

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

对于上面的代码,它现在适用于所有大多数情况,除了一个,wc不是所有的选项卡都被计算在内,但只有一个没有被某些字符占用的选项卡,例如,如果在一行的开头,我输入1234然后按一个选项卡,wc它不算作一个选项卡,但上面的代码算了,有什么方法可以解决这个问题吗?谢谢

解决了,使用了tab扩展,代码如下:

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

如果有人能给它一个解释,那就太棒了,我测试它可以工作,但不太明白。无论如何,感谢所有的帮助

4

3 回答 3

8

我不认为制表符是您的问题,wc不会将制表符计为八个字符。我认为您的问题是您正在剥离 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

解决了,使用了tab扩展,代码如下:

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 回答