2010-09-24 105 views
-2

||在Perl中如何工作?我想實現c風格||操作。`||`在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; 

} 
+2

如果你想知道的東西是如何工作的,閱讀機制的文檔:http://perldoc.perl.org/perlop.html#C-style-Logical-Or – 2010-09-24 15:42:52

+2

你應該看看' perltidy'腳本,這將使你的東西更容易閱讀和維護。你也真的需要使用'use strict;使用警告;'。如果你不這樣做,你會遇到數百個perl會告訴你的可避免的問題。 – Daenyth 2010-09-24 15:45:26

回答

13

它的工作原理與您的想法完全相同。然而,你有一個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') { ... 

或可能病例不敏感的正則表達式匹配。

+0

謝謝@rafi。有時候,小錯誤需要很多時間來解決。 – vrbilgi 2010-09-24 13:14:41

3

($ARRAY[2] ne "three") || ($ARRAY[2] ne "THREE")||是邏輯or,這意味着它返回真,如果兩個表達式中的至少一個爲真。那麼,它檢查第一個,如果它是真的,它甚至不檢查第二個。在這種情況下,無論如何,整體將是真實的,因爲$ARRAY[2]不能等於兩個字符串。

那麼,這就像在C我相信。你想實現什麼?

2

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

表達$ARRAY[$i] ne "three"結果始終爲true。因此你有一個無限循環。 ||運營商具有短路行爲,所以第二個表達式永遠不會被評估。

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

這在每種情況下都是如此。它要麼不是「三」,要麼不是「三」。你想要&&

5

兩個一般要點。 (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"; 
} 
+0

ya @FM我將在您的代碼中應用您的觀點。 – vrbilgi 2010-09-24 13:16:56