Regex 第二次读取文件句柄失败
如何在Perl中的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循环中阅
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;
}
}
}