以下 print 语句在访问数组引用的第一个元素
时有效my $aref = [6, 7, 8];
print $aref->[0];
print $$aref[0];
print ${$aref}[0];
在第3次印刷中允许/使用花括号的原因是什么?它是按设计还是偶然工作?
答案 0 :(得分:6)
原因是大括号内的表达式可能是任意复杂的。例如,想象一下,您有一个带有返回数组引用列表的方法的对象 - 并且您希望在该列表中使用第二个引用。然后您可以使用以下代码:
print ${ ($obj->array_generator)[1] }[0];
在大括号内,您可以使用任何返回数组引用的表达式。只有在简单的情况下(表达式是一个简单的标量变量)才能省略大括号。
当然,使用这种语法在引用的数组中查找元素很少是个好主意 - 我总是建议使用箭头语法。
print +($obj->array_generator)[1]->[0];
更新:我最初忘记提及的内容 - 表达式必须用括号括起来,因为它是一个返回数组引用的代码块。它不必是单个表达式。你可以(但可能不应该!)编写这样的代码:
print ${
my @arefs = $object->array_generator;
my $aref = $arefs[1];
$aref;
}[0];
答案 1 :(得分:2)
$BLOCK[EXPR]
之前, ${ get_ref() }[0]
允许get_ref()->[0]
。
我认为(首选)箭头符号语法($EXPR->[EXPR]
)比内联语法更新。数组元素取消引用的内联语法如下:
$BLOCK[EXPR]
这允许
${ get_ref() }[0] # And even more complex blocks, including one with multiple statements.
但是,为方便起见,
${ $ref }[EXPR] # BLOCK contains a simple scalar
可以缩短为
$$ref[EXPR]