2012-12-06 133 views
3

我对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)发现任何字符串。我不能让它显示任何字符串匹配(至少应该有一个)。任何关于语法,结构等的建议都是可以理解的。这是bascially我的第一个Perl脚本。

+0

您不必为第一个文件的每一行重新读取第二个文件 - 效率非常低。你不必在这里使用Perl,因为你可以用'grep -Fx file1 file2' bash命令找到文件交集。 – raina77ow

回答

2

您的$meter输入缺少chomp,因此推测它可能永远无法匹配已变形的$my_cur_line变量。

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

此外,您可能希望阻止元字符在您的匹配文本,它可以与quotemeta或\Q ... \E进行使用。

因此,简而言之,你的代码也许应该是:

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

你也真的应该使用

use strict; 
use warnings; 

的学习曲线短,超过了在调试节省了时间重达。

+0

你能解释元字符的含义吗? – TyC

+2

@TyC例如,如果你有字符串“foo?”,那么在正则表达式中意思是“fo后跟一个可选的o”,而你可能的意思是“foo后跟一个问号”。通过转义元字符,您可以从字面上理解它们。 – TLP

+0

所以你明确地说变量$米不是'$米'? – TyC

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; 

所以,现在尝试一下,现在用新的文件处理和错误检查,看看是怎么回事。我敢打赌,在文件上添加错误检查会打开你的问题。

最后注意:您不需要重复读取每次通过CURMT603文件的同一mlist文件,但这是另一次优化。

+0

使用三参数表单打开文件有什么好处? – TyC

+1

它更清晰,你不必担心它们中包含特殊字符的文件名。 –

+2

那么......词法文件句柄的好处在于它不是全局的,它在超出范围时会自动关闭。明确的开放模式可以防止使用动态且有时危险的开放模式。例如,如果'$ bar =“ TLP

相关问题