目前,当我想建立一个查找表时,我使用:
my $has_field = {};
map { $has_field->{$_} = 1 } @fields;
有没有一种方法可以一步完成内联初始化?(即在我声明它的同时填充它?)
目前,当我想建立一个查找表时,我使用:
my $has_field = {};
map { $has_field->{$_} = 1 } @fields;
有没有一种方法可以一步完成内联初始化?(即在我声明它的同时填充它?)
只需使用您的地图创建一个列表,然后放入一个哈希引用,如:
my $has_field = { map { $_ => 1 } @fields };
更新:抱歉,这并不能完全满足您的要求,因为您仍然必须先声明 $has_field 。
您可以使用哈希切片:
@{$has_field}{@fields} = (1)x@fields;
右侧是使用x
运算符通过@fields 的标量值(即数组中的元素数)重复一个。同样的另一种选择:
@{$has_field}{@fields} = map {1} @fields;
在我测试过的地方,智能匹配可以比创建查找哈希和测试一次值快 2 到 5 倍。因此,除非您要多次重复使用哈希,否则最好进行智能匹配:
if ( $cand_field ~~ \@fields ) {
do_with_field( $cand_field );
}
记住,从 5.10 开始,Perl 现在有一种原生方式来询问“这个未经测试的值是否是这些已知值中的任何一个”,这是一件好事,这是智能匹配。