@arr1 = ([1,2,3], 4, 5, 6);
$arr_ref = $arr1[0];
@arr2 = @$arr_ref;
是否可以在一个陈述中执行第2行和第3行?
我已经尝试了@arr2 = @$arr1[0];
,但它没有编译。
答案 0 :(得分:5)
由于优先规则
,您必须添加大括号@arr2 = @{$arr1[0]};
来自perldsc, Caveat on precedence
说到像
@{$AoA[$i]}
这样的事情 [...]
这是因为Perl对其五个前缀解除引用的优先规则(看起来像是某人发誓:$
@
*
%
&
)使得它们的绑定比postfix下标括号或大括号!
这意味着如果不需要显式索引,则不需要{}
,例如在已经检索数组元素的代码中。例如,要根据Sobrique的注释
@all_elems = map { ref $_ eq "ARRAY" ? @$_ : $_ } @arr1;
要检索只有arrayrefs的内容,可以在块内的三元运算符中使用: ()
而不是: $_
。 ()
返回一个空列表,该列表在结果中变平,从而不会影响它。 (当条件评估为false时,必须返回。这个技巧允许map
执行grep
工作,有效过滤。)