在这种情况下,在Perl中大括号的作用是什么?

时间:2016-11-25 14:31:02

标签: perl curly-braces

以下 print 语句在访问数组引用的第一个元素

时有效
my $aref = [6, 7, 8];
print $aref->[0];
print $$aref[0];
print ${$aref}[0];

在第3次印刷中允许/使用花括号的原因是什么?它是按设计还是偶然工作?

2 个答案:

答案 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]

请参阅Dereferencing Syntax