perlref 文档的“使用参考”部分解释了这一点。
2.将标识符(或标识符链)作为变量或子例程名称的一部分放在任何地方,都可以用返回正确类型引用的 BLOCK 替换标识符。换句话说,前面的例子可以这样写:
$bar = ${$scalarref};
push(@{$arrayref}, $filename);
${$arrayref}[0] = "January";
${$hashref}{"KEY"} = "VALUE";
&{$coderef}(1,2,3);
$globref->print("output\n"); # iff IO::Handle is loaded
在您的情况下,$records
必须是对哈希的引用(因为最外层%
),{$records}
是返回引用并%{$records}
给出原始哈希的块。
花括号围绕一个真正的块。实际上,您可以将上面的代码替换为
%{ if ($records) { $records } else { $default_records } }
但是,正如文档前面所指出的,即使是您问题中的较短版本也可以简化。
1.将标识符(或标识符链)作为变量或子例程名称的一部分放在任何地方,都可以将标识符替换为包含正确类型引用的简单标量变量:
$bar = $$scalarref;
push(@$arrayref, $filename);
$$arrayref[0] = "January";
$$hashref{"KEY"} = "VALUE";
&$coderef(1,2,3);
print $globref "output\n";
因为$records
是一个简单的标量,%$records
是底层的散列。
相反,如果$records
是对数组的引用,则取消引用它的语法是@$records
or @{$records}
。