perl的邏輯運算

2021-06-06 16:57:17 字數 1627 閱讀 2217

perl語言與其它語言一樣,也有邏輯運算,但是由於perl沒有基本變數型別的原因,邏輯運算過程往往會產生一定的隱患。

if($value){}

這種寫法,經常用來判斷$value是否已定義,尤其$value作為陣列中的值時。在通常的分類中,perl中的變數分為標量、向量和布林。其中,標量分為列隊、陣列和雜湊。標量分為數字、字串、指標和未定義。這些分類最大的特點就是可以根據當前環境互相轉化,完全沒有型別約束,這就導致了在布林環境下,大小為0的向量、數字0、空字串、未定義標量全都視為邏輯假,所以上面的if語句中,如果變數已定義但是為數字0或空串時,條件並不成立,如果此句作為全安檢查,可以說乙個隱患就形成了。

如果要避免的話可以這樣:defined $value或$value==0或$value eq '',向量使用scalar強制轉換成標量,不失為乙個好習慣。

my @array = (1, 2, 3) || die "failed to get array\n";

是不是看著眼熟?是的,在其它支援短路表示式的語言中,這是一種簡單實用的異常檢查的方法。但是在perl裡卻有了些變化,perl不但支援邏輯,還支援一種邏輯的邏輯,比如:在邏輯中,或運算子為"||",在邏輯的邏輯中,或運算子為"or",它們最大的區別就是在優先順序上,or可以用來判斷邏輯式之間的邏輯,它們與等號的優先順序為:"||" > "=" > "or"。可見,邏輯"||"的優先順序高於等號,所以上面的語句的執行順序就是這樣的:(0, 1, 2)由於處於邏輯標量環境下,被強制轉換成標量3(列隊的標量值為列隊中的元素數量),然後由於或運算是短路運算,後面的die語句不執行,或運算返回3(或運算返回左運算元的值,與運算返回右運算元的值),陣列@array將3作為自已的第乙個元素儲存。

此語句的本意是定義乙個元素為(0,1,2)的陣列,現在卻變成了(3),整個過程perl並沒有給出任何警告,以致變成了隱患。解決的辦法很簡單:把"||"換成"or"就可以了

my $curline = "0\n";

next if($curline eq 0);

這種語句常用來過濾配置檔案中只有數字0的行。當然,上面這兩句的錯誤比較明顯,我想大家應該都看出來了,因為我把$curline的值寫出來了,這個if一定不成立。但是如果這句出現在乙個比較複雜的檔案操作程式中,$curline正好讀到了"0\n"這一行(perl語言讀行時是帶著行末的回車的),這個隱患就不那麼明顯了。

perl語言中,處理比邏輯也有兩套運算子:數字比較運算子(常用的有=,>,《等)和字串比較運算子(常用的有eq,ne等),這兩套運算子運用於各自的環境中,尤其是數字與字串的混合運算中,由於perl直譯器分不清數字和字串,運算子此時就起了決定當前運算環境的作用。

上面的if語句中,用的是字串等於邏輯運算子(eq),它決定當前環境為字串運算環境,數字0被強制轉換成字串的"0",比較時判斷的是"0\n" eq "0",結果當然是返回邏輯非,並沒有達到過濾0行的作用。為了解決這個問題,我們必須把運算環境設定為數字運算環境,即使用數字邏輯等運算子"=",在此環境中,字串中的非數字字元被強制轉換成0,"0\n"就被轉成了數字0,0=0返回邏輯真,自然達到了目的。

小結perl語言被寵愛的原因之一就是靈活,可以說基本上沒有任何的約束。但是靈活有靈活的規則,上面單就邏輯運算方面舉了三個例子,都是細小的地方,但是足以形成所謂的bug,perl中其它方面更有類似的地方,可見,perl學會容易,如果想學好,細心+經驗,缺一不可。

mysql 動態邏輯運算 MySQL 邏輯運算子

not 10 10 not 1 1 1 1 not 1 1 not null 0 0 1 1 0 null 2 邏輯與 and 或 1 當所有運算元均為非零值 並且不為 null 時,所得值為 1 2 當乙個或多個運算元為 0 時,所得值為 0 3 其餘情況所得值為 null mysql selec...

邏輯運算 位運算

今天有人問我,邏輯運算是什麼,現在來解釋一下 邏輯運算就是相當於資訊競賽基礎工具中的一位的位運算 符號對應關係 wedge cap 交 and 與運算 vee cup 並 or 或運算 neg not 非 xor 異或運算 x k 將x的二進位制右移k位 如 x 10110 2 時,k 1,那麼x ...

邏輯位運算與邏輯運算

兩者非常容易混淆,其實這是截然不同的兩種運算.1.邏輯位運算 與運算 1 2 0 0000 0001 0000 0010 0000 0000 0 或運算 1 2 3 0000 0001 0000 0010 0000 0011 3 按位求反 運算,異或 運算略.移位 左移,右移 運算略.2.邏輯運算 ...