Perl输入文件字符串匹配

Perl输入文件字符串匹配,perl,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

我对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;
}
#/css/dvltools/localperl/bin/perl
打开CUMRT603,“CUMRT603”;
我的$meter,$cur\u线;
而()
{
$my\u cur\u line=$\u;
咀嚼$my_cur_线;
打开仪表清单,“mlist”;
而()
{
$meter=$\;
如果($my\u cur\u line=~/“$meter/)
{
打印“在$my\u cur\u行上找到$meter”;
}
}
关闭仪表清单;
}
基本上,我正在搜索CUMRT603以查找列表(mlist)中找到的任何字符串。我无法让它显示任何字符串匹配(应该至少有一个)。任何关于语法、结构等的建议都会被提及。这基本上是我的第一个perl脚本。

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

一个大问题是没有检查
打开的结果。如果无法打开该文件,则其他任何操作都无法正常工作。您将不会从
中获得任何结果,并且您将在
循环时立即退出外部
。打开
仪表列表
时也会出现同样的情况

另外,你需要把

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;
使用警告;
严格使用;

打开(我的$cur_文件,您的
$meter
输入缺少
chomp
,因此它可能永远无法匹配chomped
$my_cur_行
变量

此外,正则表达式中的双引号将按字面解释,因此如果
$meter
foo
,它将尝试匹配
“foo”
,我不确定这是您想要的

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

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

chomp $meter;
if ( $my_cur_line =~ /\Q$meter\E/ )
你也真的应该使用

use strict;
use warnings;

短的学习曲线比调试中节省的时间更重要。

您不必为第一行的每一行重新读取第二个文件-这非常低效。而且您不必在这里使用Perl,因为您可以找到与
grep-Fx file1 file2
bash命令的文件交叉点。使用取消三个参数表单?这更清楚,而且您不必担心文件名中包含特殊字符。嗯……词法文件句柄的好处是它不是全局的,当超出范围时会自动关闭。显式打开模式防止使用动态的,有时甚至是危险的打开模式。例如,
openFOO,$bar
是危险的,如果
$bar=“
@TyC,例如,如果您有字符串
FOO?
,则在正则表达式中表示“fo后跟可选的o”,而您可能表示“FOO后跟问号”。通过转义元字符,您可以按字面解释它们。因此,您明确表示变量$meter不是“$meter”?我是说
/“$meter”/
匹配
“foo”
,而不是
foo
。除非您要查找文字引号,否则不要在正则表达式中使用引号。确实是引号导致匹配不起作用。感谢您的帮助。