perl中的|| =是什么?

Bos*_*ick 10 perl operators

查看阅读Excel的文档,有一个我不太了解的声明.

有人可以解释一下$sheet -> {MaxRow} ||= $sheet -> {MinRow};吗?

我得到它的赋值运算符.但是我不明白它||是如何工作的?

Cod*_*ame 17

$sheet -> {MaxRow} ||= $sheet -> {MinRow};
Run Code Online (Sandbox Code Playgroud)

相当于:

$sheet -> {MaxRow} = ( $sheet -> {MaxRow} || $sheet -> {MinRow});
Run Code Online (Sandbox Code Playgroud)

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


bgo*_*dst 10

||=操作是逻辑或指派.它类似于+=add-assign.它计算LHS和RHS的逻辑OR,然后将结果分配给LHS,因此LHS必须是有效的左值.

换句话说,就像

$a += 3;
Run Code Online (Sandbox Code Playgroud)

相当于

$a = $a+3;
Run Code Online (Sandbox Code Playgroud)

我们可以这么说

$a ||= 1;
Run Code Online (Sandbox Code Playgroud)

相当于

$a = $a||1;
Run Code Online (Sandbox Code Playgroud)

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

$sheet->{'MaxRow'} ||= $sheet->{'MinRow'};
Run Code Online (Sandbox Code Playgroud)

相当于

$sheet->{'MaxRow'} = $sheet->{'MaxRow'}||$sheet->{'MinRow'};
Run Code Online (Sandbox Code Playgroud)

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

有关逻辑OR操作的更多信息,请参阅http://en.wikipedia.org/wiki/Logical_disjunction,有关Perl特定信息,请参阅http://perldoc.perl.org/perlop.html#C-style-Logical -Or(对于||//)和http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or(对于or).最相关的引用,来自Perl文档||:

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

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

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