运算符<>问题

时间:2018-02-19 08:18:17

标签: perl

我创建了一个名为fred的文件:

fred_1
fred_2
fred_3

我编写了一个名为lac.pl

的Perl脚本
while(<>){
    print reverse <>;
}

然后我执行以下命令。

为什么输出会错过fred_1而程序没有结束,只是在等待我的输入?

如果我像下面那样更新Perl脚本,结果将是正确的:

print reverse <>;

2 个答案:

答案 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;
    }
}