【问题标题】:How does the `||` work in Perl?`||` 在 Perl 中是如何工作的?
【发布时间】:2011-04-16 18:16:47
【问题描述】:

|| 在 Perl 中是如何工作的?我想实现c风格的||操作。

@ARRAY=qw(one two THREE four);

$i=0;

if(($ARRAY[2] ne "three")||($ARRAY[2] ne "THREE"))         #What's the problem with this
{
   print ":::::$ARRAY[2]::::::\n";
}


while(($ARRAY[$i] ne "three")||($ARRAY[$i] ne "THREE"))       #This goes to infinite loop

{

 print "->$ARRAY[$i]\n";
   $i=$i+1;

}

【问题讨论】:

  • 如果您想了解某些东西的工作原理,请阅读文档:perldoc.perl.org/perlop.html#C-style-Logical-Or
  • 您应该查看perltidy 脚本,这将使您的内容更易于阅读和维护。您还真的需要使用use strict; use warnings;。如果你不这样做,你会遇到数百个 perl 会告诉你的可以避免的问题。

标签: perl logical-operators short-circuiting


【解决方案1】:

它的工作方式与您想象的完全一样。但是,您对自己的情况有想法。每个值都不是一个值不是另一个值。

我相信你可能想要

if ($ARRAY[2] ne 'three' && $ARRAY[2] ne 'THREE') { ...

if ($ARRAY[2] eq 'three' || $ARRAY[2] eq 'THREE') { ...

您可能还需要一些不区分大小写的比较方式,例如

if (lc $ARRAY[2] ne 'three') { ...

或者可能是不区分大小写的正则表达式匹配。

【讨论】:

  • 感谢@rafi。有时小错误需要很多时间来解决。
【解决方案2】:

两个一般要点。 (1) 你的 Perl 脚本应该包括use strictuse warnings。 (2) 在大多数情况下,您可以直接遍历数组,完全避免使用下标。一个例子:

use strict;
use warnings;

my @ARRAY = qw(one two THREE four);

for my $item (@ARRAY){
    last if lc $item eq 'three';
    print $item, "\n";
}

【讨论】:

    【解决方案3】:

    ($ARRAY[2] ne "three") || ($ARRAY[2] ne "THREE") 中,|| 是一个逻辑or,这意味着如果两个表达式中的至少一个为真,则它返回真。好吧,它检查第一个,如果是真的,它甚至不检查第二个。在这种情况下,无论如何,整体都是正确的,因为$ARRAY[2] 不能等于两个字符串。

    嗯,我相信它就像在 C 中一样。你想达到什么目标?

    【讨论】:

      【解决方案4】:

      while(($ARRAY[$i] ne "three")||($ARRAY[$i] ne "THREE"))

      表达式$ARRAY[$i] ne "three" 总是计算为真。因此,您有一个无限循环。 || 运算符具有短路行为,因此永远不会计算第二个表达式。

      【讨论】:

        【解决方案5】:
         ($ARRAY[$i] ne "three") || ($ARRAY[$i] ne "THREE")) 
        

        这在任何情况下都是正确的。它要么不是“三”,要么不是“三”。你想要&&

        【讨论】:

          猜你喜欢
          • 2010-10-14
          • 1970-01-01
          • 2013-04-10
          • 2013-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-16
          相关资源
          最近更新 更多