2012-02-16 89 views
0

這段Perl代碼是一段代碼開頭的變量聲明的一部分。這是什麼意思?這行代碼試圖做什麼?

my $EXPLICIT_YEAR = $ALL_PAGES ? 0 : ($store{year} || $current_year); 
+1

http://perldoc.perl.org/perlop.html#Conditional-Operator – toolic 2012-02-16 02:36:53

回答

4

它是等效於這樣的:

my $EXPLICIT_YEAR; 
if ($ALL_PAGES) { 
    $EXPLICIT_YEAR = 0; 
} 
else { 
    # $EXPLICIT_YEAR = $store{year} || $current_year; 
    if ($store{year}) { 
     $EXPLICIT_YEAR = $store{year}; 
    } 
    else { 
     $EXPLICIT_YEAR = $current_year; 
    } 
} 

$conditional ? $true : $false部是三元如果。 $store{year} || $current_year部分使用了||的事實。運算符返回第一個值爲true的值,如果$ store {year}爲「false」(零,空字符串等),則允許使用$ current_year

+0

難道不應該是'如果($ ALL_PAGES!= 0 )'? – 2012-02-16 02:17:37

+0

其實我第一次寫的時候誤讀了。這是一個通用的標量真實性測試,所以你的筆記比我的筆記更準確,但不像我現在所做的那樣正確。 – kbenson 2012-02-16 02:21:01

+0

我會進一步補充說,這個代碼(和幾乎所有基於if的解決方案不會創建一堆臨時變量)將多次評估參數,而三元條件只會評估一次。如果'$ store {year} $'被一些函數調用所替代,這可能很慢或者可能會打印到控制檯或者可能會改變全局狀態,這將非常重要。 – 2012-02-16 02:42:07

0

我不是一個Perl的開發者,但我99%肯定(這適用於大多數其他語言),它等於:如果變量$ALL_PAGES爲真(或1),然後是0評估,如果不是,評估($store{year} || $current_year)

0

我知道perl只有很多C,所以採取一種猜測這裏:

Set variable EXPLICIT_YEAR to 
    ( if ALL_PAGES == true then 0 
     else ((get store indexed at year) or current_year)) 

的或操作

false or false = false 
false or true = true 
true or false = true 
true or true = true 
+0

我確實認爲這是AND操作的真值表。 – 2012-02-16 02:22:30

+0

根據@ jb。的評論修正了表格。 – ikegami 2012-02-16 02:49:44

+1

這不是真正的(Perl)「或」操作。它短路並返回最後一個操作數,而不是一些一般的真或假值。這與這個問題特別相關。 – ikegami 2012-02-16 02:50:00

1
my $EXPLICIT_YEAR = $ALL_PAGES ? 0 : ($store{year} || $current_year); 

此表達式使用Ternary "?:" operator,並結合使用|| C-style logical OR的子表達式。見perldoc perlop

$ALL_PAGES ? 

表達的?前 - 條件 - 評價爲布爾表達式。一個真值表示任何非零值,空字符串或未定義(未聲明)。

0 : ($store{year} || $current_year) 

上的:任一側上的值將被返回的值,這取決於條件的返回值。如果條件評估爲真,則返回最左邊的值,否則返回最右邊的值。最左邊的值僅爲零0

$store{year} || $current_year 

最右邊的值是一個表達式本身,使用C風格的邏輯OR運算符。它將返回最左邊的值,如果它評估爲真(並忽略最右邊的值)。否則,它會返回最右邊的值。所以:

  • 如果$ ALL_PAGES是真實的,然後設置$ EXPLICIT_YEAR零
  • 否則,如果$ ALL_PAGES是假的,那麼:
  • 如果$商店{一年}爲真,則設置$ EXPLICIT_YEAR至$店{年份}
  • ,否則設置$ EXPLICIT_YEAR至$ CURRENT_YEAR