2013-07-08 54 views
2

的匿名數組另一個值直接訪問值給出散列以下匿名數組:基於散列中

$AoH = [ 
    {  
     'FORM_FIELD_ID'  => '10353', 
     'VISIBLE_BY'   => '10354', 
     'FIELD_LABEL'   => 'ISINCIDENT', 
     'VALUE'    => '', 
     'DEFAULT_FIELD_LABEL' => 'Yes No', 
     'FORM_ID'    => '2113', 
    }, 
    { 
     'FORM_FIELD_ID'  => '10354', 
     'VISIBLE_BY'   => '0', 
     'FIELD_LABEL'   => 'CATEGORY', 
     'VALUE'    => 'zOS Logical Security (RACF)', 
     'DEFAULT_FIELD_LABEL' => 'CATEGORY', 
     'FORM_ID'    => '2113', 
    }, 
    { 
     'FORM_FIELD_ID'  => '10368', 
     'VISIBLE_BY'   => '10354', 
     'FIELD_LABEL'   => 'STARTDATE', 
     'VALUE'    => '', 
     'DEFAULT_FIELD_LABEL' => 'REQTYPE', 
     'FORM_ID'    => '2113', 

    } 
]; 

我怎麼會因爲我知道FORM_FIELD_ID是10353直接訪問FIELD_LABEL價值?

我知道我可以通過@$AoH循環並有條件地找到$_->{FIELD_LABEL}基於$_->{FORM_FIELD_ID} == 10353,但是有無論如何直接訪問想要的值,如果在相同的散列中的其他值之一是已知的?

+2

如果要直接查找,則需要將FORM_FIELD_ID重新映射到散列鍵。 – TLP

+0

哦,我的!在[Devel :: REPL'](https://metacpan.org/module/Devel::REPL)中使用'dd @ $ AoH',然後使用'my%by_form_field_id = map { $ _-> {FORM_FIELD_ID} => $ _} @ $ AoH;'然後'dd%by_form_field_id'可視化顯示速度來自何處。 +1 TLP和阿蒙。 –

+0

一個很好的基本和有幫助的問題。 TLP的評論和@ amon的回答使它有助於學習如何更快速地製作簡單的東西。 (改變標籤) –

回答

4

不,除非你改變你的數據結構。你可以例如指數記錄由他們的表單域ID:

my %by_form_field_id = map { $_->{FORM_FIELD_ID} => $_ } @$AoH; 

然後:

my $field_label = $by_form_field_id{10353}{FIELD_LABEL}; 

不改變數據結構,你真的要grep

my $field_label = (grep { $_->{FORM_FIELD_ID} == 10353 } @$AoH)[0]->{FIELD_LABEL}; 
+0

其實,grep會工作得很好。謝謝! – Namuna

+0

如果你的'@ AoH'在大小上比平凡的索引數組更好,像這樣的散列元素是最好的。讓阿米恩+1,看起來很容易。 @amon ...你正在製作%HoH's,所以「 - >」是可選的,'by_form_field_id {10353} {FIELD_LABEL}'看起來非常乾淨和簡單。使用這種數據結構方法,還是編寫自定義搜索函數以使用'grep' count在TIMTOWTDI意義上可以接受? –

+1

@ G.Cito與'grep'ping一樣,創建查找哈希是* O(n)*操作。如果我必須執行多個查找,我會創建哈希,因爲每個查找都以* O(1)*運行。即對於* m *查找(* m> 1 *),使用哈希是* m *倍於'grep'的速度。對於單個查找,「grep」更快。我不在乎Tim Toady,只要使用正確的工具。 – amon

0

你不得不寫通過@array的函數循環並檢查%hash或者可能使用內建的grep方法:

say $_->{FIELD_LABEL} for (grep { $_->{FORM_FIELD_ID} == 10353 } @$AoH) 

的作品。所以做這個的:

say %$_->{FIELD_LABEL} for (grep { $_->{FORM_FIELD_ID} == 10353 } @$AoH) 

,但它給出了一個Using a hash as a reference is deprecated警告(與pumpkin perl-5.16.3)。

相關問題