2013-06-05 18 views
1

假設我有一串字符串,例如@matches = ("cat", "zebra", "apple"),我想打開一個文件並嘗試以最簡單的方式匹配這些字符串。如何使用正則表達式匹配來查找模式數組中的字符串?

while (<MYFILE>) 
{ 
    chomp; 

    if (..some match condition...) 
    { 
     ..stuff.. 
    } 
} 

我可以只使用一個foreach在每一行要儘量配合,但我知道有一定是在Perl簡潔的方式說「如果串x匹配任何陣列Y.的模式」我似乎無法在任何地方找到它。

編輯:

爲了澄清,這裏是非常低效的代碼:

while (<MYFILE>) 
{ 
    chomp; 

    foreach $m (@matches) 
    { 
     if (~ /$m/) 
     { 
      ..stuff.. 
     } 
    } 
} 

我知道有這樣的一些快捷方法。

+2

你是什麼意思與「匹配」? (a)「等於」,(b)「包含as substring」,或者(c)「用作正則表達式時匹配」?你願意使用非核心模塊嗎?這對於「任意」結 – amon

+0

的使用情況很好,請參閱上面的編輯。 – CaptSaltyJack

回答

2

如何使用join來做一個即興正則表達式?

my @matches = ("cat", "zebra", "apple"); 
my $rx = join "|", @matches; 

while (<$fh>) { 
    if ($_ =~ /$rx/) { 
     # stuff 
    } 
} 
+0

這很好,但首先,我認爲只用'qr'或添加'o'標誌來編譯正則表達式會更有效率。其次,要注意交替中單詞的順序,因爲「貓類」可能是危險的。 – Birei

+0

@Birei你可以預見到'cat'和'category'會產生衝突嗎? – TLP

+0

我以爲OP想知道什麼是匹配的,而不僅僅是它是否存在匹配。沒問題,忘記它。 – Birei

0

您似乎想要使用@matches的條目作爲正則表達式。然後,你可以將它們加入到一個更大的正則表達式:

my $rx = join '|', @matches; 

while (<>) { 
    do stuff if $_ =~ $rx; 
} 

如果你想匹配的@matches條目的文字內容,使@matches = ("foo+")foo+而不是fooo如上述方案會做匹配,你可以構建正則表達式像

my $rx = join '|', map quotemeta, @matches; 
0
my @matches = qw(cat zebra apple); 

{ local $" = '|'; 

    while (<>) { 
     chomp; 
     if (/@matches/) { ... } 
    } 
} 

但要小心。閱讀文檔:

perldoc perlvar | grep "\$LIST_SEPARATOR" -A 12 

:)

相關問題