【问题标题】:Why //= (defined-or) does not work in same way for array as for scalar? [duplicate]为什么 //= (defined-or) 对数组的工作方式与对标量的工作方式不同? [复制]
【发布时间】:2017-07-05 21:34:17
【问题描述】:

我有以下代码:

$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

【问题讨论】:

  • 数组和哈希变量永远不能未定义,只能为空,但这与错误无关。

标签: perl operators


【解决方案1】:

数组和散列变量永远不能是undefined,只能是empty。如果我写@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 /

【讨论】:

    【解决方案2】:

    "Assignment Operators" in perldoc perlop:

    这些组合赋值运算符只能对标量进行操作...

    【讨论】:

    • 另见this@a = @b || @c; 真正的意思是@a = scalar(@b) || @c;
    • @Dada:如果在标量上下文中测试操作数会非常方便,但返回它们as is
    • 鉴于您正在回答自己的问题,您可能需要付出一些努力来比perlop 中的引用更详细地解释为什么部分。
    • 这个问题没有回答这个问题,即为什么定义或不能以与标量相同的方式工作?。它只是证实确实如此。
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2014-09-04
    • 2018-02-23
    相关资源
    最近更新 更多