Perl:在文件中多次搜索匹配项

时间:2013-08-07 16:32:51

标签: regex perl

在我的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。

3 个答案:

答案 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,因此这里是您可以使用的一般说明

  • 始终使用strict

  • 使用open

    的三参数形式
    open ( my $INFILE, "<", "./input.txt");
    
  • my与每个变量用于本地化

答案 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良好实践的其他答案中的要点同样适用。