我有这段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
可以工作。
为什么会出现这种现象以及如何解决?
答案 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