Как работает `||` в Perl? - PullRequest
       33

Как работает `||` в Perl?

0 голосов
/ 24 сентября 2010

Как || работает в Perl? Я хочу добиться операции в стиле ||.

@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;

}

Ответы [ 5 ]

13 голосов
/ 24 сентября 2010

Это работает точно так, как вы думали.Тем не менее, у вас есть Thinko в вашем состоянии.Каждое значение - это не одно значение или , а не другое значение.

Я полагаю, что вы, возможно, хотели

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

или

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

Выможет также потребоваться не зависящий от регистра способ сравнения, такой как

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

или, возможно, не зависящее от регистра совпадение с регулярным выражением.

5 голосов
/ 24 сентября 2010

Два основных момента.(1) Ваши сценарии Perl должны включать use strict и use 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 голосов
/ 24 сентября 2010

В ($ARRAY[2] ne "three") || ($ARRAY[2] ne "THREE") || является логическим or, что означает, что он возвращает истину, если хотя бы одно из двух выражений истинно. Ну, он проверяет первый и, если это правда, он даже не проверяет второй. И в этом случае целое все равно будет истинным, так как $ARRAY[2] не может быть равным обеим строкам.

Ну, это как в С, я верю. Чего бы вы хотели достичь?

2 голосов
/ 24 сентября 2010

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

выражение $ARRAY[$i] ne "three" всегда имеет значение true.Поэтому у вас есть бесконечный цикл.Оператор || имеет короткое замыкание, поэтому второе выражение никогда не вычисляется.

1 голос
/ 24 сентября 2010
 ($ARRAY[$i] ne "three") || ($ARRAY[$i] ne "THREE")) 

Это будет верно в каждом случае. Это будет либо «три», либо не «три». Вы хотите &&.

...