2014-10-08 45 views
0

我所遇到以下遺留代碼:多餘//使用的,或有必要

sub some_func { 
    my $val = $ENV{some_key} // ''; 
    if (length($val)) { 
     return $val; 
    } 

    return 0; 
} 

通常我會解僱這是令人費解和改寫:

sub some_func { 
    return $ENV{some_key} || 0; 
} 

但是誰寫的程序員這很不錯。我錯過了什麼嗎?

+2

afaict兩者之間的唯一區別是當環境變量爲'0'時是否返回'0'或0。 – ysth 2014-10-08 15:00:19

+0

在原始代碼中它確實是一個'//',或者它應該是'||'。後者更有意義。但是,既然你在看ENV變量,我認爲空字符串會比0更好,所以像'return $ ENV {some_key} || 「」;'可能會更好。 – jimtut 2014-10-08 17:02:36

+2

@jimtut,'// //非常有意義。它使Perls早於5.12的undef警告「長度」保持沉默。這是執行'我的$ val = $ ENV {some_key};的另一種方式; if(defined($ val)&& length($ val))'。 (在第一個代碼片段中使用'||'只有在它有效地等同於第一個片段中的'//'時纔有意義。) – ikegami 2014-10-08 19:12:29

回答

8

原件:

  • 空字符串⇒零(如數字)
  • 字符串零⇒零(字符串)
  • 編號零⇒零(如數字)
  • 未定義⇒零(作爲數字)

每個荷蘭國際集團否則返回$ ENV {some_key}


重寫:

  • 空字符串⇒零(如數字)
  • 字符串零⇒零(如數字)
  • 數爲零⇒零(作爲數字)
  • 未定義⇒零(作爲數字)

其他一切返回$ ENV {} some_key


因此,有這不是猜想重要微小的差別,但在某些情況下確實(例如encode_json)。不過,我認爲這種差異是無意的。