perl中的|| =是什么?

时间:2015-03-27 13:45:55

标签: perl operators

查看Reading Excel的文档,有一个我不太了解的陈述。

有人可以解释$sheet -> {MaxRow} ||= $sheet -> {MinRow};的作用吗?

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

2 个答案:

答案 0 :(得分:17)

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

相当于:

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

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

答案 1 :(得分:10)

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

换句话说,就像

一样
$a += 3;

相当于

$a = $a+3;

我们可以说

$a ||= 1;

相当于

$a = $a||1;

现在,关于你在问题中提到的陈述,那里的内容比上面的例子略多一些。在您的语句中,LHS不仅仅是一个简单的变量标记,而且是一个被视为哈希引用($sheet)的变量标记,并且被取消引用以获取用字符串{{键入的值。 1}}。 RHS也是'MaxRow'上的哈希取消引用操作,但其关键是$sheet。但行为是一样的;我们可以说

'MinRow'

相当于

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

(注意:我总是喜欢将哈希键值明确地引用为字符串,因为它们是什么,但并不是每个人都有这种显性程度。)

有关逻辑OR操作的更多信息,请参阅http://en.wikipedia.org/wiki/Logical_disjunction,有关Perl特定信息,请参阅http://perldoc.perl.org/perlop.html#C-style-Logical-Or(适用于$sheet->{'MaxRow'} = $sheet->{'MaxRow'}||$sheet->{'MinRow'}; ||)和{{3} }(对于//)。最相关的引用来自or上的Perl文档:

  

Binary" ||"执行短路逻辑或运算。也就是说,如果左操作数为true,则甚至不评估右操作数。标量或列表上下文如果被计算,则向下传播到右操作数。

这并没有完全解释它;如果LHS评估为真值(参见下面的定义),则||操作的返回值是LHS的值,否则它是RHS的值。

在Perl中,逻辑值通常由||(有时为0'')表示为false,undef表示为true。但是,更具体地说,任何不是上述三个错误值之一的值都被视为真,有时程序员使用非正式术语来引用这种区别" truthy"和" falsy"。 IOW,10''是假的,其他一切都是真实的。有关详细信息,请参阅http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or