查看Reading Excel的文档,有一个我不太了解的陈述。
有人可以解释$sheet -> {MaxRow} ||= $sheet -> {MinRow};
的作用吗?
我认为它是一个赋值运算符。但是我不明白||
是如何工作的?
答案 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,1
,0
和''
是假的,其他一切都是真实的。有关详细信息,请参阅http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or。