2012-08-17 111 views
5

目前,當我想建立一個查表我用:聲明並在Perl填充哈希表在一個步驟

my $has_field = {}; 
map { $has_field->{$_} = 1 } @fields; 

有沒有一種方法,我可以在一個單一的步驟做內聯初始化? (即在同一時間,我宣佈它來填充它?)

回答

14

只要用你的地圖創建一個列表,然後拖放到如哈希參考:

my $has_field = { map { $_ => 1 } @fields }; 
3

更新:對不起,這不做你想要的東西,因爲你仍然必須首先聲明$ has_field。

你可以使用一個散列切片:

@{$has_field}{@fields} = (1)[email protected]; 

右手側使用x操作者通過@fields的標量值(即,您的數組中的元素的數量)重複一個。在同樣的另一種選擇:

@{$has_field}{@fields} = map {1} @fields; 
+0

這工作正常,但仍然需要單獨聲明'$ has_field'時使用'use strict;'。儘管知道它仍然是一個很好的竅門。 – 2012-08-17 15:07:01

2

在那裏我已經測試過它smart match可以2至5倍的速度創建查找散列和測試值一次。所以,除非你打算重用哈希好多次,這是最好做一個智能匹配:

if ($cand_field ~~ \@fields) { 
    do_with_field($cand_field); 
} 

這是要記住,因爲5.10,Perl中現在有一個辦法是好事本地到問「這是未經測試的任何值這些已知值」,它是智能匹配

+0

感謝這個偉大的提示。我一定會把它用來使用。 – dan1111 2012-08-17 20:10:54