Perl输入文件字符串匹配
我对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
#! /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
。除非您要查找文字引号,否则不要在正则表达式中使用引号。确实是引号导致匹配不起作用。感谢您的帮助。