我有一个类似以下的代码段:
use strict;
use warnings;
# file names to search for
open(my $files, "<", "fileList.txt") or die "Can't open fileList.txt: $!";
my $flag = 0;
while (<$files>) {
print "File loop: $_\n";
open(my $search, "<", "searchMe.txt") or die "Can't open searchMe.txt: $!";
$flag = 0;
while (<$search>){
print "Search loop: $_\n";
}
}
fileList.txt包含一行:“CheckFilesFunctions.pm”
searchMe.txt包含一行:abc
这里的输出是
File loop: CheckFilesFunctions.pm
Search loop: abc
然而。当我将搜索循环更改为以下内容时
while (<$search> && !$flag){
突然搜索循环开始打印
Search loop: CheckFilesFunctions.pm
为什么$ _的范围在这里更改?
最佳答案
while (<filehandle>)
是while (defined( $_ = <filehandle> ))
的便捷缩写;如果您要测试更复杂的表达式,则需要明确包含完整内容:
while ( defined( $_ = <$search> ) && ! $flag ) {
尽管我建议显式使用
readline
(<>
可以表示readline
或glob
,具体取决于参数;我更喜欢直接使用它们)并使用词法变量:while ( defined( my $line = readline $search ) && ! $flag ) {
或者,您可以跳出循环而不用修改条件:
while (<$search>) {
...
if (...) {
last;
尽管查看了您的代码,您可能希望在文件循环之前将搜索文件读入数组一次,然后循环遍历该数组。