【问题标题】:Perl: search for a match multiple times in a filePerl:在文件中多次搜索匹配项
【发布时间】:2013-08-07 16:32:50
【问题描述】:

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

【问题讨论】:

  • 您为什么希望该代码打印“找到!” string 何时只匹配文件的第一行?
  • @kjprice:你编辑掉了代码中的一个错误。
  • @toolic,哇,我以为编译不出来……只是认为这是一个错字。
  • @kjprice:由于我在代码中使用了“for”循环,因此我期望在每次迭代中,它将从输入文件的开头重新开始并找到匹配项。不正确吗?

标签: regex perl


【解决方案1】:

你得到这个是因为当你在 perl 中读取文件时,它会标记你在文件中读取的最后一个位置,所以它不会再次读取它,在你的情况下,你读取了整个文件,所以你标记到文件末尾并且您需要通过再次搜索开始来重置位置

for($i=0; $i < 3; $i++ ){
    seek(INFILE,0,0);
    #...

这会将文件句柄重置为重新开始,请参阅perl seek tut

既然您开始学习 perl,那么这里有一个您可以使用的一般说明

  • 始终使用strict

  • 使用open的三参数形式

    open ( my $INFILE, "<", "./input.txt");
    
  • 对每个变量使用my 进行本地化

【讨论】:

    【解决方案2】:

    变化:

    if ($line = ~/string/ ){
    

    到:

    if ($line =~ /string/ ){
    

    【讨论】:

      【解决方案3】:

      你的问题在于while (! $found &amp;&amp; ($line = &lt;INFILE&gt;))的条件部分

      $line = &lt;INFILE&gt;实际上将文件的完整内容分配给$line它确实逐行分配。通过扩展,您的循环只运行一次。

      解决此问题的可能解决方案是:

      • 您应该将循环更改为for my $line (&lt;INFILE&gt;) 以逐行读取文件,并将$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 良好实践的其他答案中的要点照常适用。

      【讨论】:

        猜你喜欢
        • 2013-12-21
        • 2019-04-10
        • 2018-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        • 2013-11-25
        相关资源
        最近更新 更多