【问题标题】:Why doesn't ||= work with arrays?为什么 ||= 不适用于数组?
【发布时间】:2011-05-22 02:56:38
【问题描述】:

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

$x ||= 1;

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

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

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

【问题讨论】:

    标签: arrays perl operators


    【解决方案1】:

    因为|| 是一个标量运算符。如果@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) 这样的空行将打印。
    【解决方案2】:

    这个page有一个很好的解释,恕我直言:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2020-08-31
      • 2021-10-31
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      相关资源
      最近更新 更多