perl 中的 ||= 是做什么用的?

what is ||= in perl for?

查看Reading Excel的文档,有一个说法我不太明白。

谁能解释一下 $sheet -> {MaxRow} ||= $sheet -> {MinRow}; 的作用?

我知道它是一个赋值运算符。但是我不明白 || 是如何工作的?

||= 运算符是逻辑或赋值。类似于+=,就是add-assign。它计算 LHS 和 RHS 的逻辑或,然后将结果分配给 LHS,因此它必须是一个有效的左值。

换句话说,就像

$a += 3;

等同于

$a = $a+3;

我们可以这样说

$a ||= 1;

等同于

$a = $a||1;

现在,关于你在问题中提到的陈述,那里发生的事情比我上面的例子要多一些。在您的声明中,LHS 不仅是一个简单的变量标记,而且是一个被视为哈希引用($sheet)的变量标记,并且被取消引用以获取以字符串 [= 键控的值19=]。 RHS 也是对 $sheet 的哈希解引用操作,但它的键是 'MinRow'。但是行为是一样的;我们可以这样说

$sheet->{'MaxRow'} ||= $sheet->{'MinRow'};

等同于

$sheet->{'MaxRow'} = $sheet->{'MaxRow'}||$sheet->{'MinRow'};

(注意:我总是喜欢将散列键值显式引用为字符串,因为它们就是这样,但并不是每个人都喜欢那种程度的明确性。)

有关逻辑或运算的更多信息,请参阅 http://en.wikipedia.org/wiki/Logical_disjunction, and for Perl-specific info, see http://perldoc.perl.org/perlop.html#C-style-Logical-Or (for || and //) and http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or(对于 or)。最相关的引用,来自 ||:

上的 Perl 文档

Binary "||" performs a short-circuit logical OR operation. That is, if the left operand is true, the right operand is not even evaluated. Scalar or list context propagates down to the right operand if it is evaluated.

这并没有完全解释清楚;如果 LHS 的计算结果为真值(定义见下文),则 || 操作的 return 值是 LHS 的值,否则是 RHS 的值。

在 Perl 中,逻辑值通常用 0(有时 ''undef)表示假,1 表示真。然而,更具体地说,任何不是上述三个假值之一的值都被视为真,有时程序员使用非正式术语 "truthy" 和 "falsy" 来指代这种区别。 IOW、0''undef 是假的,其他都是真值。有关详细信息,请参阅 http://www.perlmonks.org/?node=what%20is%20true%20and%20false%20in%20Perl%3F

$sheet -> {MaxRow} ||= $sheet -> {MinRow};

相当于:

$sheet -> {MaxRow} = ( $sheet -> {MaxRow} || $sheet -> {MinRow});

仅当第一个操作数为假时,本地 OR 运算符才计算第二个操作数。 因此,如果 MaxRow 为 0(可能是第一次迭代),则 MaxRow 将获得 MinRow 的值。