为什么 while 不在 grep 之后循环?

Why does while not loop after grep?

我有这段 perl 代码:

open( FILENAME, "<", "some_valid_path");
my $needs_tags = 0;
if (!grep{/$open_tag/} <FILENAME>){
    $needs_tags = 1;
}
while ( <FILENAME> )
{
    warn "$_\n";
}

问题是在 grep 之后,while 根本不再运行。但是如果我删除 grepwhile 就可以了。

为什么会出现这种行为以及如何解决?

您已经消耗了所有输入数据并耗尽了文件句柄,因此除非您倒回文件,否则您需要重新打开它以使其回到开始位置,以便您可以再次扫描。

您可以使用 seek 重新定位读取指针:

seek(FILENAME, 0, SEEK_SET);

如果您想在一次读取过程中执行此操作,您必须先将输入捕获到数组,然后再进行 grep 和循环。

grep 施加 list context, in which <> 读取整个文件和 returns 行列表。

因此 运行 和 while 的文件句柄上没有任何内容。

如果 grep 应该遍历整个文件,然后 seek 回到开头 seek FILENAME, 0, 0 和然后逐行再次阅读。


由于一次读取整个文件,不妨将行存储在一个数组中并使用它

my @lines = <FILENAME>;
# chomp @lines;  # if needed

$needs_tags = 1 if not grep { /.../ } @lines;

for (@lines) { ... }