2013-07-04 44 views
0

這是什麼Perl表達「」?

$DEBUG>=3 && DEBUG("OK=$ok"); 

什麼讓我如此困惑主要是布爾操作「& &」。任何人能解釋一下嗎?謝謝。

回答

5

這是一樣的:

if($DEBUG >= 3) { 
    DEBUG("OK=$ok"); 
} 

DEBUG("OK=$ok") if $DEBUG >= 3; 

我個人比較喜歡這一個(這是更具可讀性對我來說)

說明:

Sentence1 && Sentence2

Sentence2只有在Sentence1爲真時纔會執行。該& &運算符是邏輯與,所以如果第一句是假的,完整的操作將是假的(它沒有neccesary評估第二句)

+0

當然,由於存在誤解運營商優先級的風險,開發人員可能會寫出表達式在他/她的褲子座位上飛行。我目睹了產品代碼失敗,因爲開發人員不明白'&&'緊密綁定,而''和'綁定鬆散。在這種表達方式中''和''是最好的,因爲它的運算符優先級低;然而,謹慎的開發人員會使用括號使其絕對清晰,而不管優先規則如何,與什麼綁定。 –

+0

另一個問題,如果我將「&&」更改爲「||」,這是什麼意思? – wuchang

+0

如果你放了'||',它將只執行'DEBUG()'部分,如果'$ DEBUG'不大於或等於3因爲邏輯或。只有當左邊表達式不正確時纔會執行'||'的右側。還有比'或'更緊的綁定。 – simbabque

1

$ DEBUG必須爲3或更多,return值必須爲trueTrue裝置,其不

  • 是undef
  • 「」
  • 「0」
  • 該過載轉換不限福地對象布爾值返回false
  • 空數組和空散列

帶子的布爾部分也將被執行。因此,如果您的表達式位於if子句中,則return值將成爲該表達式的一部分。例如。

sub test { 
    return 1; 
} 

if ($abc >2 && test()) { 
    ... 
} 
+0

由於這是一個單獨的陳述,右手邊是否爲真並不重要。只有當它處於'if'狀態時才重要。 – simbabque

1

報價perlop

C風格的邏輯並且

二進制「& &」執行短路邏輯AND操作。即 如果左操作數爲假,則不計算右操作數。 如果評估爲 ,則標量或列表上下文向下傳播到右操作數。

+0

另一個問題,如果我將「&&」更改爲「||」,這是什麼意思? – wuchang

+0

'二元「||」執行短路邏輯或操作。也就是說,如果左操作數爲真,則不計算右操作數。標量或列表上下文向下傳播到右操作數,如果它被評估 – devnull

0

&&運營商。但是,像C一樣,Perl使用邏輯快捷方式。如果左側是錯誤的,那麼你知道整個陳述是錯誤的,所以你不必測試右側。但是,如果左側爲真,則必須測試右側以確保整個陳述是真實的。

因此,如果$DEBUG >= 3爲真,則將執行右側$OK = "ok"。這是一樣的:

if ($DEBUG >= 3) { 
    $OK = "ok"; 
} 

而且,我認爲,最好是寫出來就像我很長的路要走。即使你知道&&在邏輯陳述中所做的事情,它也需要你的大腦幾毫秒的處理來確定$DEBUG>=3 && $OK="ok";正在做什麼。然而,執行起來可能不會更快,而不是長久寫下來。

在未來的某個地方,一些可憐的系統應用程序員(又名sap)必須進入並維護代碼。如果代碼被嚴密編寫的祕密陳述陷入困境,這將是一個需要維護的熊。


甚至不認爲寫$OK = "ok" if $DEBUG >= 3;的。這不是一個後固定if語句的情況。