-2

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

}
4

5 に答える 5

13

それはまさにあなたが思った通りに機能します。しかし、あなたの状態には考えがあります。すべての値は、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') { ...

または、大文字と小文字を区別しない正規表現の一致の可能性があります。

于 2010-09-24T12:19:30.517 に答える
5

一般的な2点。(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";
}
于 2010-09-24T13:01:59.800 に答える
3

これ($ARRAY[2] ne "three") || ($ARRAY[2] ne "THREE")||or2 つの式の少なくとも 1 つが true の場合に true を返すことを意味します。最初のものをチェックし、それが真であれば、2 番目のものもチェックしません。$ARRAY[2]この場合、両方の文字列と等しくなることはできないため、とにかく全体が true になります。

まあ、それはCIの信念と同じです。何を達成したいですか?

于 2010-09-24T12:17:53.577 に答える
2

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

$ARRAY[$i] ne "three"は常に true と評価されます。したがって、無限ループがあります。演算子には||短絡動作があるため、2 番目の式は評価されません。

于 2010-09-24T12:20:31.310 に答える
1
 ($ARRAY[$i] ne "three") || ($ARRAY[$i] ne "THREE")) 

これはあらゆる場合に当てはまります。「3」ではないか、「3」ではないかのどちらかです。あなたがしたい&&

于 2010-09-24T12:21:46.507 に答える