linux - 试图计算 perl 中一行中的字符数,但失败了

标签 linux perl count line wc

一开始我只是简单的用下面的来统计每一行的长度:

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

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

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

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

解决了,用了tab expansion ,这里是代码:

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

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

最佳答案

我不认为制表符是您的问题,wc 不会将制表符计为八个字符。我认为您的问题是您正在剥离 EOL,但 wc 计算了它们。此外,您没有累积长度,您只是在跟踪最后一行的长度。这:

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

应该更像这样:

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

关于linux - 试图计算 perl 中一行中的字符数,但失败了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5844699/

相关文章:

php - 使用php远程连接到mysql服务器

linux - 在 Linux 中编写快捷的临时 GUI 应用程序的最简单方法(语言、工具等)是什么?

perl - 用于确定日期之间天数的 DateTime.pm 代码

regex - 以模式排列给定的线

mysql - 按类型返回每个月的用户数

c++ - 代码:: block linux glext.h "reference to uint64_t is ambiguous"

linux - 用于文件夹中所有文件中 token 替换的 shell 脚本

perl - Coldfusion 加密和 Perl 解密

具有多个左连接的 Mysql 计数

mysql - 计算 MySQL 中的列