试图在perl中计算一行中的字符并且失败了

use*_*275 1 linux perl count line wc

在开始时,我只是使用以下内容来计算每行的长度:

while(<FH>){
    chomp;
    $length=length($_);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

解决了它,使用了tab扩展,这里是代码:

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

如果有人能给它一个解释,那将是很棒的,我测试它是有效的,但不太明白.无论如何,感谢所有的帮助

mu *_*ort 8

我认为标签不是你的问题,wc不会将标签计为8个字符.我认为你的问题是你正在剥离EOL,但是wc会对它们进行计算.此外,你没有累积长度,你只是跟踪最后一行的长度.这个:

while(<FH>){
    chomp;
    $length=length($_);
}
Run Code Online (Sandbox Code Playgroud)

应该更像这样:

my $length = 0;
while(<FH>) {
    $length += length($_);
}
# $length now has the total number of characters
Run Code Online (Sandbox Code Playgroud)