2012-02-09 47 views
-1

我有一個多維散列/數組,看起來像這樣使用datadumper;測試存在的密鑰與子串

{ 
      'Customer' => {'123abc' => 
         {'status' => 
            {'New' => 
               {'email'=>['[email protected]' ], 
               'template' => 'XYZ' } 
                     } 
                  }, 
         '234' => 
         {'status' => 
            {'New' => 
              {'email' => ['[email protected]' ], 
              'template' => 'XYZ' } 
                      } 
                   } 

$customers = ("123abc", "234abc", "adb234"); 

我需要根據數組值完整或部分匹配來測試客戶是否存在。

我用於完整匹配的代碼正常工作;

foreach (@customers) { 
if ($config->{Customer}->{$customers[0]}) { 
do something 
} } 

這將返回的「123ABC」

一場比賽,但我不能讓它匹配時,有在$客戶[0]或不數組$客戶只是測試,並只使用字符串234一個字符串。

我試過了;

if (/.234*$/ ~~ %config->{Customer}) 

基於本網站智能匹配的例子「打印‘我們有一些青少年\ n’如果/.*teen$/ ~~%H;」。

if (exists $config->{Customer}->{/234/} 

以及使用M在正則表達式的開始。 {M/234 /}

喬恩

這是用Perl編寫。

+0

perl,php?什麼語言? – hvgotcodes 2012-02-09 17:09:30

+0

234在$ customers [0]應該與什麼相匹配? 「234abc」,「adb234」,都是?? – cirne100 2012-02-10 00:32:44

+0

它應該匹配兩個 – 2012-02-10 04:32:50

回答

1

看起來你想grep所有的鍵。

my @keys = grep { /234/ } keys %{$config->{Customer}}; 
if (@keys) { 
    # do something, but check for multiple matches... 
} 

grep的返回,其中該塊的值爲真,與每個元件由$ 表示的所有元素。正則表達式匹配(//)默認匹配$。上面的語句可以改寫爲

my @keys = grep { $_ =~ /234/ } keys %{$config->{Customer}}; 
if (@keys) { 
    # do something, but check for multiple matches... 
} 

但是,只要你熟悉perl,這是多餘的。

+0

週二我返回時,當我在劇本面前放置腳本時,我將不得不考慮這一點。 – 2012-02-10 04:40:07

+0

腳本的整個流程是將XML配置文件讀取到散列/數組中。然後將文件讀入具有訂單號和狀態的散列。然後執行SQL查詢並將結果寫入數組中。然後它循環遍歷數組,並使用狀態散列測試狀態差異。如果發現有變化,它會在配置散列中匹配客戶和狀態,如果發現匹配,則執行附加處理。在完全匹配時效果很好,但我需要將sql results數組中的多個客戶與config數組中的單個條目匹配。 – 2012-02-10 04:49:48