perl - 为什么//=(定义或)对于数组的工作方式与对于标量的工作方式不同?

标签 perl operators

我有以下代码:

$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

最佳答案

数组和哈希变量永远不能未定义,只能为空。如果我写 @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 /

关于perl - 为什么//=(定义或)对于数组的工作方式与对于标量的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44925354/

相关文章:

perl - 如何分析这个散列示例的散列?

linux - perl + perl 脚本位置在/etc/rc3.d 下,结果不同

perl - 在 perl 中解压文件

perl - 提取预定义多行字符序列包围的部分

c - post increment和post decrement运算符在c语言运算符优先级规则中有什么位置

windows - ActiveState Perl 5.14 无法比较某些值?

c++ - c++中的i+++增量是什么

c++ - ofstream 或 ostream 类型如何将所有类型转换为字符串?

c++ - 模板类上的二元运算符重载

java - 为什么 &&、&、|| 的输出不同?