我创建了一个名为fred
的文件:
fred_1
fred_2
fred_3
我编写了一个名为lac.pl
的
while(<>){
print reverse <>;
}
然后我执行以下命令。
为什么输出会错过fred_1
而程序没有结束,只是在等待我的输入?
如果我像下面那样更新Perl脚本,结果将是正确的:
print reverse <>;
答案 0 :(得分:4)
为什么这是错的?因为while(<>)
会将一行读入$_
。然后你忽略了价值。然后它等待您的输入,因为您在完成后再次使用<>
。所以它猜测你想要从输入中读取,因为你已经用完了其他所有可用的东西。
答案 1 :(得分:4)
您错过了第一行,因为您已使用$_
将其读入while(<>)
。
print reverse <>;
<>
在列表上下文中进行评估。也就是说,所有剩余的输入都被插入到一个反转并打印的列表中。
现在,循环返回到条件,等待输入上的另一行。尝试
print reverse <>;
本身,而不是循环。
当然,像这样的淤泥会使程序的内存占用量与输入的大小成比例,这对大输入来说是不实际的。
如果您确实需要撤消大文件,请使用File::ReadBackwards:
#!/usr/bin/env perl
use strict;
use warnings;
use File::ReadBackwards;
for my $arg (@ARGV) {
my $reader = File::ReadBackwards->new($arg)
or die "Cannot read '$arg': $!";
while (defined(my $line = $reader->readline)) {
print $line;
}
}