为什么// =(defined-或)对于数组和标量的工作方式不同?

时间:2017-07-05 11:47:18

标签: perl operators

我有以下代码:

$var //= 1;
@arr //= qw/ 1 2 3 /;

但我得到错误:

  

Can't modify array dereference in defined or assignment (//=) at ...

即使这个@arr ||= qw/ 1 2 3 /;也不起作用:

  

Can't modify array dereference in logical or assignment (||=) at ...

但这可以按预期工作:

@arr = @arr || qw/ 1 2 3 /;

print "@arr"; # 1 2 3

2 个答案:

答案 0 :(得分:3)

数组和哈希变量永远不能未定义,只能为空。如果我写@arr = undef,那么@arr将成为包含单个未定义标量的单元素数组。那不是一个未定义的数组

此表达式

@arr //= qw/ 1 2 3 /

在两个操作数上强加标量上下文scalar(qw/ 1 2 3 /)为3,而scalar @arr@arr中无法分配的元素数量,无论如何也永远不会被定义

要设置空数组,请使用此

@arr = qw/ 1 2 3 / unless @arr

您还可以使用条件表达式

@arr = @arr ? @arr : qw/ 1 2 3 /

答案 1 :(得分:1)

请参阅"Assignment Operators" in perldoc perlop

  

这些组合赋值运算符只能在标量上运行...