Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 第二次读取文件句柄失败_Regex_Perl - Fatal编程技术网

Regex 第二次读取文件句柄失败

Regex 第二次读取文件句柄失败,regex,perl,Regex,Perl,如何在Perl中的foreach循环中第二次读取文件句柄 foreach $a (@b){ while(my $line = <IN>){ if($line = /$a/){ print $line; } } } foreach$a(@b){ while(我的$line=){ 如果($line=/$a/){ 打印$行; } } } 上述代码未处理列表@b中的第二个元素。如何使之成为可能?您在while循环中阅

如何在Perl中的
foreach
循环中第二次读取文件句柄

foreach $a (@b){
    while(my $line = <IN>){
        if($line = /$a/){
            print $line;
        }
    }
}
foreach$a(@b){
while(我的$line=){
如果($line=/$a/){
打印$行;
}
}
}

上述代码未处理列表
@b
中的第二个元素。如何使之成为可能?

您在
while
循环中阅读,直到文件句柄耗尽(到达
EOF
文件末尾)。 如果不关闭并重新打开文件句柄,则在外循环的第二次迭代中将不再读取它

如果从filehandle读取的数据量没有那么大,则可以将该文件读入数组变量并迭代数组变量的内容

例如:

my @filecontent = <IN>;
foreach $item_of_b (@b){
    foreach my $line_of_file (@filecontent){
        if($line_of_file =~ /$item_of_b/){
            print $line_of_file;
        }
    }
}
my@filecontent=;
每个$item_of_b(@b){
foreach my$line_of_文件(@filecontent){
if($line\u of_file=~/$item\u of_b/){
打印\u文件的$line\u;
}
}
}

$a
$b
不应用作变量名,它们因排序而特殊。

您的内部循环,
而(my$line=)
则从
句柄中的
提取行,直到到达文件末尾

当您的外部循环,
foreach$a(@b)
再次尝试从
中的
读取时,它仍然位于文件的末尾。
foreach
循环的第一次迭代将使用文件中的所有行,而其他迭代将不保留任何内容

有几种可能的方法可以解决此问题:

  • 在再次尝试读取之前,请返回
中的
开头:

foreach $a (@b){
    seek IN, 0, 0
        or die "Cannot seek(): $!";
    while (my $line = <IN>) {
        ...
    }
}

@zdim你知道这个问题的解决方法吗?解释一下你想做什么。什么是@b?您的文件处理程序在哪里?
是一个readline操作<
中的code>是文件句柄,而不是处理程序。(另外,不要使用裸字文件句柄。)为什么不简单地交换这两个循环?在外面做
while()
,这样你就不用再担心读取文件了。@cherry(直到现在才看到这个——你得到了一个非常好的答案:)@melponmene谢谢你的详细解释。我很理解这个概念。
my @lines = <IN>;
foreach $a (@b){
    foreach my $line (@lines) {
        ...
    }
}
while (my $line = <IN>) {
    foreach $a (@b) {
        ...
    }
}
while (my $line = readline $IN) {
    foreach my $re (@regexes) {
        if ($line =~ /$re/) {
            print $line;
        }
    }
}