我想预先初始化哈希数组的元素,以便在填写数据时,我不需要检查是否存在各种成员并在每个循环中初始化它们.如果可以的话,我想预先初始化数据结构的一般形式,它应该是这样的:
$num_sections = 4;
# Some magic to initialize $VAR1 to this:
$VAR1 = {
'sections' => [
{},
{},
{},
{}
]
};
Run Code Online (Sandbox Code Playgroud)
我想这个工作,
$ph->{sections} ||= [({} x $num_sections )];
但它导致了
$VAR1 = {
'sections' => 'HASH(0x21b6110)HASH(0x21b6110)HASH(0x21b6110)HASH(0x21b6110)'
};
Run Code Online (Sandbox Code Playgroud)
并且没有使用()列表上下文和{}空哈希引用的数量似乎使其工作.
这可行,但它不是一个单行
unless ($ph->{sections})
{
push @{ $ph->{sections}}, {} foreach (1..$num_sections);
}
Run Code Online (Sandbox Code Playgroud)
我可以使用一些perl魔法来添加unless到最后,但我还没有弄明白.
我觉得我太近了,但我真的不能理解.
更新 Oleg指出这可能根本没有必要.见下面的评论.
如果左侧x不是parens,x则在其LHS上重复该字符串并返回这些字符串的串联.
如果左侧x是parens,则x重复其LHS上的值并返回副本.
后一种方法更接近你想要的,但它仍然是错误的,因为你最终会对单个哈希进行多次引用.您不仅要创建新引用,还要创建新哈希.为此,您可以使用以下内容:
$ph->{sections} ||= [ map { +{} } 1..$num_sections ];
Run Code Online (Sandbox Code Playgroud)