在一个语句中取消引用数组中的数组?

时间:2016-06-06 05:37:32

标签: arrays perl multidimensional-array dereference

@arr1 = ([1,2,3], 4, 5, 6);
$arr_ref = $arr1[0];
@arr2 = @$arr_ref;

是否可以在一个陈述中执行第2行和第3行?

我已经尝试了@arr2 = @$arr1[0];,但它没有编译。

1 个答案:

答案 0 :(得分:5)

由于优先规则

,您必须添加大括号
@arr2 = @{$arr1[0]};

来自perldsc, Caveat on precedence

  

说到像@{$AoA[$i]}这样的事情   [...]
  这是因为Perl对其五个前缀解除引用的优先规则(看起来像是某人发誓:$ @ * % &)使得它们的绑定比postfix下标括号或大括号!

这意味着如果不需要显式索引,则不需要{},例如在已经检索数组元素的代码中。例如,要根据Sobrique的注释

展开内部带有arrayrefs的数组
@all_elems = map { ref $_ eq "ARRAY" ? @$_ : $_ } @arr1;

要检索只有arrayrefs的内容,可以在块内的三元运算符中使用: ()而不是: $_()返回一个空列表,该列表在结果中变平,从而不会影响它。 (当条件评估为false时,必须返回。这个技巧允许map执行grep工作,有效过滤。)