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

时间:2018-10-19 19:10:23

标签: perl loops filesystems

我有这段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可以工作。

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

2 个答案:

答案 0 :(得分:3)

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

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

seek(FILENAME, 0, SEEK_SET);

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

答案 1 :(得分:3)

abstract class VideoBase { protected $config_types = array('production' =>'Configures all hardware for production runs', 'development'=>'Configures project specific development connections '. 'if available. Otherwise, only out the window and '. 'heads down connections are made'); function __construct() { print_r($config_types); } function __destruct() { } } 施加列表context ,其中<>读取整个文件并返回行列表。

因此,文件句柄上没有任何东西可以运行grep

如果该while 应该遍历整个文件,则在该seek之后以grep回到开头,然后逐行重新读取线。


由于要一次读取整个文件,因此不妨将行存储在数组中并对其进行处理

seek FILENAME, 0, 0