如何从Perl中的数组引用中优雅地创建哈希?

时间:2009-05-26 20:13:18

标签: perl arrays hash reference

我正在寻找一种更优雅的方法来创建包含我从配置文件中读取的列表的哈希。这是我的代码:

read_config($config_file => my %config);

my $extension_list_reference = $config{extensions}{ext};

my @ext;

# Store each item of the list into an array

for my $i ( 0 .. (@$extension_list_reference - 1) ) {
    $ext[$i] = $extension_list_reference->[$i];
}

# Create hash with the array elements as the keys

foreach my $entry (@ext) {
    $extensions{$entry} = "include";
 }   

感谢。

4 个答案:

答案 0 :(得分:13)

my %hash = map { $_ => 'include' } @list;

答案 1 :(得分:6)

尝试使用地图: http://perldoc.perl.org/functions/map.html

以下是您的新代码应该是什么样的:

my %extensions = map { $_ => "include" } @{ $config{extensions}{ext} };

答案 2 :(得分:2)

如果我理解你的问题,你就是这样做的:

@extensions{@$extension_list_reference} = ();

注意:散列的每个值都是空的,但您仍然可以使用 exists 函数检查散列中是否存在该键,如下所示:

if(exists $extensions{$some_key}) {...

P.S。如果由于某种原因你真的需要这些字符串'include'作为值,你也可以拥有它们:

@extensions{@$extension_list_reference} = ('include') x @$extension_list_reference;

答案 3 :(得分:1)

这样:

read_config($config_file => my %config);
%extensions = map +($_ => "include"), @{$config{extensions}{ext}};

或者这样:

read_config($config_file => my %config);
@extensions{@{$config{extensions}{ext}}} = ("include") x @{$config{extensions}{ext}};