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