2012-12-06 177 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

相關問題