在我的perl脚本中,我打开了一个文件并搜索了一个字符串。它很成功。但是当我在搜索之后再次搜索相同的字符串时,似乎脚本开始从文件的位置开始搜索,直到文件结束,因此它无法再找到匹配项。我的代码类似于:
open ( INFILE, "./input.txt")
for($i=0; $i < 3; $i++){
print "i = $i\n";
$found = 0;
while (! $found && ($line = <INFILE>)){
if ( $line =~ /string/ ){
print "found!\n";
$found = 1;
}
else{
print "not found!\n";
}
}
}
close (INFILE);
input.txt文件:
string
random2
random2
我期待输出为:
i = 0
found!
i = 1
found!
i = 2
found!
但原来是:
i = 0
found!
i = 1
not found!
not found!
i = 2
任何人都可以帮助我。我刚开始学习perl。
答案 0 :(得分:1)
变化:
if ($line = ~/string/ ){
为:
if ($line =~ /string/ ){
答案 1 :(得分:0)
你得到这个是因为当你在perl中读取文件时它将标记你在文件中读取的最后一个位置,因此它不会再读取它,在你的情况下你读取整个文件,所以你标记到文件的末尾你需要通过再次寻找来重置位置
for($i=0; $i < 3; $i++ ){
seek(INFILE,0,0);
#...
这会将文件句柄重置为重新开始,请参阅perl seek tut
由于您正在开始学习perl,因此这里是您可以使用的一般说明
答案 2 :(得分:0)
您遇到的问题在于while (! $found && ($line = <INFILE>))
$line = <INFILE>
实际上会将文件的完整内容分配给$line
。 NOT 逐行分配。通过扩展,您的循环只运行一次。
解决此问题的可能解决方案是:
for my $line (<INFILE>)
以逐行读取文件,并将$ found分隔为内部if($found)
。利用外部for
循环进行工作(while
是不必要的:
open ( INFILE, "./input.txt")
my @line=<INFILE>;
for($i=0; $i < scalar @line; $i++) {
print "i = $i\n";
if ( $line[$i] =~ /string/ ){
print "found!\n";
} else {
print "not found!\n";
}
}
close (INFILE);
关于Perl良好实践的其他答案中的要点同样适用。