展平Perl的哈希数组

nov*_*cik 2 perl

目前有这个演示代码:

use 5.012;
use Data::Dump;

my $AoH = [
    {a => "aval"},  #exactly only one key-value
    {b => "bval"},  #for each
    {c => "cval"},  #array element
];

dd $AoH;

my @arr = map { each $_ } @$AoH;
dd @arr;
Run Code Online (Sandbox Code Playgroud)

它起作用并产生我想要的结果

[{ a => "aval" }, { b => "bval" }, { c => "cval" }]
("a", "aval", "b", "bval", "c", "cval")
Run Code Online (Sandbox Code Playgroud)

问题是:结构是否正确map { each $_ },还是可以用"另一种方式"来做到这一点?

Mil*_*ler 5

只需取消引用hashrefs:

my $AoH = [
    {a => "aval"},  #exactly only one key-value
    {b => "bval"},  #for each
    {c => "cval"},  #array element
];

# Flatten the hash refs
my @arr = map { %$_ } @$AoH;
Run Code Online (Sandbox Code Playgroud)

我建议不要each在这种情况下使用.来自perldoc:

从Perl 5.14开始,each可以使用标量EXPR,该标量必须保持对未经处理的散列或数组的引用.该参数将自动解除引用.这方面each被认为是高度实验性的.在未来的Perl版本中,确切的行为可能会发生变化.

  • 你的建议是有效的.你会看到`每个$ _`失败,重复最后两行(`my @arr = map {each $ _} @ $ AoH; dd @arr; my @ arr2 = map {each $ _} @ $ AoH; dd @ arr2;`).引用的段落无关紧要.使用`each%$ _`根本没用. (3认同)