5

目前,当我想建立一个查找表时,我使用:

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

有没有一种方法可以一步完成内联初始化?(即在我声明它的同时填充它?)

4

3 回答 3

14

只需使用您的地图创建一个列表,然后放入一个哈希引用,如:

my $has_field = { map { $_ => 1 } @fields };
于 2012-08-17T14:55:29.413 回答
3

更新:抱歉,这并不能完全满足您的要求,因为您仍然必须先声明 $has_field 。

您可以使用哈希切片:

@{$has_field}{@fields} = (1)x@fields;

右侧是使用x运算符通过@fields 的标量值(即数组中的元素数)重复一个。同样的另一种选择:

@{$has_field}{@fields} = map {1} @fields;
于 2012-08-17T15:02:37.330 回答
2

在我测试过的地方,智能匹配可以比创建查找哈希和测试一次值快 2 到 5 倍。因此,除非您要多次重复使用哈希,否则最好进行智能匹配:

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

记住,从 5.10 开始,Perl 现在有一种原生方式来询问“这个未经测试的值是否是这些已知值中的任何一个”,这是一件好事,这是智能匹配

于 2012-08-17T15:40:23.087 回答