3

我对 Perl 很陌生,正在尝试编写一个脚本来搜索文件并检查/匹配来自其他输入文件的多个字符串。这是我现在所拥有的:

#! /css/dvltools/localperl/bin/perl

open CUMRT603, "CUMRT603";

my $meter, $my_cur_line;
while ( <CUMRT603> )
{
        $my_cur_line = $_;
        chomp $my_cur_line;

        open METER_LIST, "mlist";
        while ( <METER_LIST> )
        {
                $meter = $_;
                if ( $my_cur_line =~ /"$meter"/ )
                {
                        print "Found $meter on $my_cur_line";
                }
        }

        close METER_LIST;
}

基本上,我正在 CUMRT603 中搜索列表 (mlist) 中的任何字符串。我无法让它显示任何字符串匹配项(应该至少有一个)。任何关于语法、结构等的建议都值得关注。这基本上是我的第一个 perl 脚本。

4

2 回答 2

2

您需要告诉我们“无法正常工作”是什么意思。当你运行它时会发生什么?你得到什么结果?你期待什么结果?

一个大问题是您没有检查open. 如果文件无法打开,则其他任何操作都无法正常工作。你不会得到任何结果<CURMT603>,你会立即退出外while循环。的打开也是如此METER_LIST

另外,你需要把

use warnings;
use strict;

在您的程序顶部,以帮助您捕获拼写错误。否则,Perl 会让事情滑倒,因为它假设你知道得更好,但这里不是这样。

第三,使用三参数形式open并使用词法文件句柄。

第四,可以直接读入变量。您不必分配 from $_

所以这里是你所拥有的快速重写。

use warnings;
use strict;

open( my $cur_file, '<', 'CURMT603' ) or die "Unable to open CURMT603: $!";

while ( my $cur_line = <$cur_file> ) {
    chomp $cur_line;
    open( my $meter_file, '<', 'mlist' ) or die "Can't open meter file: $!";
    while ( my $meter = <$meter_file> ) {
        if ( $my_cur_line =~ /"$meter"/ ) {
            print "Found $meter on $my_cur_line\n";
        }
    }
    close $meter_file;
}
close $cur_file;

所以,尝试一下,现在使用新的文件处理和错误检查,看看效果如何。我敢打赌,在打开的文件上添加错误检查会发现你的问题。

最后一点:您不需要mlist每次通过文件一遍又一遍地重新读取同一个CURMT603文件,但这是另一次的优化。

于 2012-12-06T15:15:43.087 回答
2

chomp您的输入缺少 a $meter,因此大概它永远无法匹配 chomped$my_cur_line变量。

此外,您的正则表达式中的那些双引号将按字面意思解释,因此如果$meterfoo,它将尝试匹配"foo",我不确定这是您想要的。

此外,您可能希望防止在匹配的文本中使用元字符,这可以使用 quotemeta 或\Q ... \E.

因此,简而言之,您的代码可能应该是:

chomp $meter;
if ( $my_cur_line =~ /\Q$meter\E/ )

你也真的应该使用

use strict;
use warnings;

较短的学习曲线对节省的调试时间起到了重要作用。

于 2012-12-06T15:24:38.133 回答