0

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

4

3 回答 3

0

改变:

if ($line = ~/string/ ){

至:

if ($line =~ /string/ ){
于 2013-08-07T16:42:45.000 回答
0

您遇到的问题在于条件部分while (! $found && ($line = <INFILE>))

$line = <INFILE> 实际上将文件的完整内容分配$line给. 它不会逐行分配。通过扩展,您的循环只运行一次。

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

  • 您应该将循环更改为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 良好实践的其他答案中的要点照常适用。

于 2013-08-09T05:31:11.967 回答
0

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

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

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

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

  • 总是使用严格的

  • 使用open的三参数形式

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

于 2013-08-07T17:31:12.250 回答