2013-07-16 46 views
-4

我有一個Perl腳本,在另一個字符串數組中搜索不同的子字符串(完全不相關的子字符串)。我現在使用循環和'if-else if-else if'來實現它。我搜索字符串數組中的單個子字符串,並在第一個匹配項上進行分解。我想知道是否可以通過避免循環來進一步優化它?是否有可能,例如在單個語句中搜索所有子字符串並獲取字符串中可用的子字符串的索引。perl多個正則表達式與發現的模式索引

E.g.讓子串的數組成爲名稱子串(類型@)並且包含元素(abc,c10,9GH)。還有另一個數組字符串,例如'buffers'(類型@)。根據哪些子串匹配,我必須調用某個特定的函數。目前,我的僞代碼是:

Loop through the buffers: 
check: 
if found abc -> call funABC() 
else if found c10 -> call funC10() 
else if found 9GH -> call fun9GH() 

我完全想避免第二個if-else if-else if語句並進一步優化它。 Perl對此有任何支持嗎?

+3

我有點困惑你在問什麼。你能發佈你當前的代碼,以及一些示例輸入和輸出嗎? – ruakh

+0

問題以字符''?'結尾。 – 2013-07-16 22:17:58

回答

0

在不正確理解你的問題的風險...

#!/usr/bin/perl 

use strict; 
use warnings; 

# hardcode some strings and substrings 
my @strs = ("abc,c10,9GH", 
      "abc,c10", 
      "c10,9GH", 
      "abc,9GH", 
      "abc", 
      "c10", 
      "9GH"); 
my @substrs = ("abc", 
       "c10", 
       "9GH"); 

# store booleans in an array for each string 
my @matches =(); 
for (my $i = 0; $i < @strs; $i++) { 
    my @match =(); 
    for (my $j = 0; $j < @substrs; $j++) { 
     if ($strs[$i] =~ m/$substrs[$j]/) { 
      push @match => 1; 
     } else { 
      push @match => 0; 
     } 
    } 
    push @matches => @match; 

現在你可以通過@matches,存儲陣列指出哪些子爲每個緩衝區匹配的迭代。

這是你在找什麼?

+0

這是我的代碼目前正在做的。問題是,有沒有辦法避免循環? – tecMav

1
my %actions = (
    abc => sub { do something }, 
    c10 => sub { do something }, 
    '9GH' => sub { do something } 
); 

my $re = join '|', map quotemeta, keys %action; 
$re = qr/($re)/; 

for my $buffer (@buffers) { 
    $action{$1}->() if $buffer =~ m/$re/; 
} 

好消息,因爲它被翻譯成特里(阿霍Corasick)的搜索是線性的長達十子千。

+0

謝謝Hynek -Pichi- Vychodil。除了函數調用部分外,這是我想要做的。我想爲不同的子串匹配調用不同的函數。如果緩衝區匹配'abc',那麼它應該調用funcabc(),如果c10匹配,它應該調用funcc10()等等。所以我想要匹配的第一把鑰匙。 – tecMav

+0

@tecMav所以寫'funabc()'來代替'做些什麼'。 –

+0

@tecMav或者使用'&{「fun $ 1」} if $ buffer =〜m/$ re /;'我不推薦。從我的觀點來看,這遠沒有靈活性。這是容易出錯的。 –