为什么|| =不使用数组?

pla*_*etp 17 arrays perl operators

我使用||=运算符为变量提供默认值,例如

$x ||= 1;
Run Code Online (Sandbox Code Playgroud)

我尝试将此语法与数组一起使用但出现语法错误:

@array||= 1..3; 
Can't modify array dereference in logical or assignment (||=) ...
Run Code Online (Sandbox Code Playgroud)

它是什么意思,我应该如何为数组提供默认值?

cjm*_*cjm 18

因为||是标量运算符.如果@array||= 1..3;有效,它将1..3在标量上下文中进行评估,这不是您想要的.它还在标量上下文中评估数组(这是好的,因为标量上下文中的空数组是假的),除了你不能分配scalar(@array).

要指定默认值,请使用:

@array = 1..3 unless @array;
Run Code Online (Sandbox Code Playgroud)

但请注意,没有办法区分从未初始化的数组和已分配空列表的数组.它不像标量,你可以区分undef和空字符串(虽然||=不区分它们).

eugene y发现了这条perl.perl5.porters消息(官方Perl开发人员的邮件列表),其中详细介绍了这一点.

  • `||`不是标量运算符,虽然它确实在它的左操作数上强加了标量上下文.来自perlop:"标量或列表上下文如果被评估则向下传播到右操作数." `perl -MData :: Dump = dump -e"@a = 0 ||(1 ... 3); dump(\ @ a)"`print` [1,2,3]` (5认同)

Eug*_*ash 16

这个页面有一个很好的解释,imho:

op =可以出现在任何两个表达式之间,而不仅仅是var和一个表达式,左边的一个必须是标量上下文中的左值.

由于@x ||= 42相当于 scalar(@x) = @x || 42,并且您不允许使用scalar(@x)左值,因此会出现错误.