您可以再次使用map 来提取它。不过不要抱有任何幻想——它仍然在循环。不过它可能更优雅:
for my $val ( map { values %$_ } values %dh ) {
#do stuff
}
这或多或少是在做同样的事情——它使你的哈希变平——从%dh 获取values——这将是一个哈希引用列表——然后将values 拉出那些。 (我认为应该这样做,但没有测试数据我不能肯定地告诉你)。
注意 - 来自values 的退货顺序未定义,因此您将按随机顺序获得它们。如果您愿意,您可以通过keys(也许sort)控制订购。
map 所做的只是评估代码块,并将结果作为列表返回。这就是 map { $_ => 1 } qw ( one two three ) 起作用的原因 - 它实际上返回一对值,当您将其分配给哈希时被视为键值对。
use Data::Dumper;
my @stuff = map { $_ => 1 } qw ( one two three );
print Dumper \@stuff;
my %hash = map { $_ => 1 } qw ( one two three );
print Dumper \%hash;
所以 - map 在这里返回 2 个值,您可以写成:
my @stuff = map { $_, 1 } qw ( one two three );
因为当然,=> 实际上只是一个逗号(在引用周围有一些额外的功能)。
因此,当对数组进行取消引用时,您也可以这样做——values 从map 中的每个元素返回一个值列表。
为了清楚起见:
use Data::Dumper;
my @stuff = ( [ 1, 2, 3 ], [4, 5, 6], [7, 8, 9] );
print Dumper \@stuff;
my @newstuff = map { @$_ } @stuff;
print Dumper \@newstuff;
本质上是在做同样的事情——遍历@stuff 中的每个哈希引用(因为这就是perl 中实现多维数组的方式),然后“解包”它们,返回结果。