2012-08-17 110 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