【发布时间】:2011-05-22 02:56:38
【问题描述】:
我使用||= 运算符为变量提供默认值,例如
$x ||= 1;
我尝试将此语法与数组一起使用,但出现语法错误:
@array||= 1..3;
Can't modify array dereference in logical or assignment (||=) ...
这是什么意思,我应该如何为数组提供默认值?
【问题讨论】:
我使用||= 运算符为变量提供默认值,例如
$x ||= 1;
我尝试将此语法与数组一起使用,但出现语法错误:
@array||= 1..3;
Can't modify array dereference in logical or assignment (||=) ...
这是什么意思,我应该如何为数组提供默认值?
【问题讨论】:
因为|| 是一个标量运算符。如果@array||= 1..3; 有效,它将在标量上下文中评估1..3,这不是您想要的。它还在标量上下文中评估数组(这没关系,因为标量上下文中的空数组是假的),除了你不能分配给scalar(@array)。
要分配默认值,请使用:
@array = 1..3 unless @array;
但请注意,没有办法区分从未初始化的数组和分配了空列表的数组。它不像标量,您可以在其中区分undef 和空字符串(尽管||= 不区分它们)。
eugene y 找到了this perl.perl5.porters message(Perl 开发人员的官方邮件列表),其中详细介绍了这一点。
【讨论】:
|| 不是标量运算符,尽管它确实在其左操作数上施加了标量上下文。来自 perlop:“如果计算,标量或列表上下文会向下传播到正确的操作数。” perl -MData::Dump=dump -e "@a = 0 || (1 .. 3); dump(\@a)" 打印 [1, 2, 3]
perl -le'print 0 || 1..3' 打印 123,而不是像 print scalar(1..3) 这样的空行将打印。
这个page有一个很好的解释,恕我直言:
op= 可以出现在任意两个之间 表达式,而不仅仅是一个 var 和一个 表达式,但是左边的必须是 标量上下文中的左值。
因为
@x ||= 42等价于scalar(@x) = @x || 42,而你不是 允许使用scalar(@x)作为 左值,你得到一个错误。
【讨论】: