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

时间:2010-12-08 09:37:36

标签: arrays perl operators

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

$x ||= 1;

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

@array||= 1..3; 
Can't modify array dereference in logical or assignment (||=) ...

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

2 个答案:

答案 0 :(得分:18)

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

要指定默认值,请使用:

@array = 1..3 unless @array;

但请注意,没有办法区分从未初始化的数组和已分配空列表的数组。它不像标量,您可以在其中区分undef和空字符串(尽管||=不区分它们。)

eugene y发现了this perl.perl5.porters message(官方Perl开发人员的邮件列表),详细介绍了这一点。

答案 1 :(得分:16)

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

  op =可以在任何两个之间发生   表达式,而不仅仅是var和an   表达式,左边的必须是   标量语境中的左值。

     

因为@x ||= 42相当于   scalar(@x) = @x || 42,而你却不是   允许使用scalar(@x)作为   左值,你得到一个错误。