Perl输入文件字符串匹配

时间:2012-12-06 15:04:17

标签: perl

我是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脚本。

2 个答案:

答案 0 :(得分:2)

你需要告诉我们“无法让它正常工作”的意思。你跑的时候会发生什么?你得到了什么结果?您期望得到什么结果?

一个大问题是您没有检查open的结果。如果无法打开文件,那么其他任何内容都无法正常工作。您将无法获得<CURMT603>的结果,以及您将立即退出外部while循环的结果。 METER_LIST的开放也是如此。

另外,你需要把

use warnings;
use strict;

在您的计划的顶部,以帮助您捕捉拼写错误。否则,Perl会让事情滑动,因为它会让你知道更好,但事实并非如此。

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

第四,你可以直接阅读变量。您无需从$_分配。

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

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文件,但这是另一次优化。

答案 1 :(得分:2)

您的chomp输入中缺少$meter,因此可能永远不会匹配所选择的$my_cur_line变量。

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

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

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

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

你也应该使用

use strict;
use warnings;

简短的学习曲线不仅仅是为了节省调试时间。