初始化给定长度的空哈希数组-单行

时间:2019-02-28 14:27:39

标签: perl

我想预先初始化哈希数组的元素,以便在需要填充数据时不需要检查各种成员的存在并在每个循环中初始化它们。如果可以的话,我想预先初始化数据结构的一般形式,如下所示:

$num_sections = 4;
# Some magic to initialize $VAR1 to this:
$VAR1 = {
          'sections' => [
                          {},
                          {},
                          {},
                          {}
                        ]
        };

我想这样做,

$ph->{sections} ||= [({} x $num_sections )];

但是会导致

$VAR1 = {
          'sections' => 'HASH(0x21b6110)HASH(0x21b6110)HASH(0x21b6110)HASH(0x21b6110)'
        };

使用()列表上下文和{}空哈希引用似乎没什么用。

这行得通,但不是一排便的

unless ($ph->{sections})
{
    push @{ $ph->{sections}}, {} foreach (1..$num_sections);
}

也许可以使用一些perl魔术将unless添加到末尾,但是我还没有弄清楚。

我觉得我已经很亲近了,但是我还是不太明白。

更新 Oleg指出,这可能根本没有必要。请参阅下面的评论。

1 个答案:

答案 0 :(得分:5)

如果x的左侧不在括号内,则x在其LHS上重复 string 并返回这些字符串的串联。

如果x的左侧处于有效状态,则x在其LHS上重复该值并返回副本。

后一种方法更接近于您想要的方法,但是它仍然是错误的,因为您最终将获得对单个哈希的多个引用。您不仅要创建新的引用,还要创建新的哈希。为此,您可以使用以下代码:

$ph->{sections} ||= [ map { +{} } 1..$num_sections ];