2012-09-25 7 views
0

最近我在博客上遇到了這個Perl表達式,無法抓住它的目的。

my $success = 1; 
    $success &&= $insert_handle->execute($first, $last, $department); 
    $success &&= $update_handle->execute($department); 
+0

我嘗試了一個小腳本,用於推測$ i = 0,$ a = 1; $ a &&=$i; print「$ a:$ i」; –

+0

總之,這是一個運行一堆步驟直到第一個失敗,然後停止的羅嗦方法。 –

回答

9
EXPR1 &&= EXPR2; 

是短期的

EXPR1 = EXPR1 && EXPR2; 

(EXCE PT是EXPR1只計算一次*)

所提供的代碼

my $success = 1; 
$success &&= $insert_handle->execute($first, $last, $department); 
$success &&= $update_handle->execute($department); 

也被寫爲:

my $success = 0; 
if ($insert_handle->execute($first, $last, $department)) { 
    if ($update_handle->execute($department)) { 
     $success = 1; 
    } 
} 

my $success = $insert_handle->execute($first, $last, $department) 
      && $update_handle->execute($department); 

* —如果EXPR1有副作用,這很重要,如果它是一個神奇的變量或左值子元素,這很可能發生。

my $x = 3;  # Prints: 
print("$x\n"); # 3 

sub x() :lvalue { print("x\n"); $x } 

x &&= 4;  # x 
print("$x\n"); # 4 

x = x && 5;  # x x 
print("$x\n"); # 5 
+0

由於&&運算符評估右操作數,並在左操作數計算結果爲true時返回結果。 –

+0

它首先評估LHS操作數。如果它是真的,它將計算RHS操作數並將結果分配給之前由LHS返回的變量。 – ikegami

1

可能是: -

my $success = 1; 
$success = $success && $insert_handle->execute($first, $last, $department); 
$success = $success && $update_handle->execute($department); 

類似: -

a += b 
// is equivalent to 
a = a + b 
3

這是一個漫長的說法。

my $success = 
    $insert_handle->execute($first, $last, $department) 
    && $update_handle->execute($department); 
+0

+1,但我認爲最初的編碼人員希望進行一連串的方法調用,並希望他們在頁面上看起來都一樣,因此是$ success的初始設置。這種方式可以在給定的第一次呼叫之前插入呼叫而不改變任何內容。實際上,OP可能只是向我們展示了第一批幾行方法調用。 –

+0

是的,可以。儘管仍然可以像'1 && .. && .. && ...'那樣做。但是,無論如何,我試圖做的是用簡單的表達來解釋含義,而不是推薦替代品。每個編碼者都要決定他如何表達他或她自己;-) –