为什么 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
根本不再运行。但是如果我删除 grep
,while
就可以了。
为什么会出现这种行为以及如何解决?
您已经消耗了所有输入数据并耗尽了文件句柄,因此除非您倒回文件,否则您需要重新打开它以使其回到开始位置,以便您可以再次扫描。
您可以使用 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) { ... }
我有这段 perl 代码:
open( FILENAME, "<", "some_valid_path");
my $needs_tags = 0;
if (!grep{/$open_tag/} <FILENAME>){
$needs_tags = 1;
}
while ( <FILENAME> )
{
warn "$_\n";
}
问题是在 grep
之后,while
根本不再运行。但是如果我删除 grep
,while
就可以了。
为什么会出现这种行为以及如何解决?
您已经消耗了所有输入数据并耗尽了文件句柄,因此除非您倒回文件,否则您需要重新打开它以使其回到开始位置,以便您可以再次扫描。
您可以使用 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) { ... }