2010-06-29 118 views
1
$df{key} =10 ; return ; if $result == 10 ; 

給我一個錯誤。我怎樣才能做到這一點?如何以多條語句爲條件調用後置語句?

+0

你想做什麼? – kennytm 2010-06-29 09:16:30

+0

$ df {key} = 10,如果$ result == 10則返回; – Tree 2010-06-29 09:40:25

+0

我希望你在我的回答中注意到了警告。 – Zaid 2010-06-29 09:45:18

回答

9

if的陳述後表單只適用於單個陳述。你必須附上多個語句塊中的if條件,這本身需要用括號括起來後:

if ($result == 10) { 

    $df{key} = 10; 
    return; 
} 

在這種情況下,有可能有兩種說法結合起來後陳述條件。這裏的想法是通過執行布爾評估來將這兩個語句合併爲一個。

然而,這一般一個好主意,因爲它可能會短路並未能做到你所期望的一樣,當$df{key} = 0

$df{key} = 10 and return if $result == 10; 

perlsyn

在Perl中,定義範圍的一系列語句稱爲塊

...通常情況下,塊由大括號(也稱爲大括號)分隔。我們將這個句法結構稱爲BLOCK。

以下複合語句可以被用來控制流速:

if (EXPR) BLOCK

if (EXPR) BLOCK else BLOCK

if (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK

4

可以組語句成do BLOCK和使用條件 語句該複合語句中的修飾符。

do { $df{key} = 10; return } if $result == 10; 

與Zaid發佈的and構造不同,這不是不明確的。但是,在使用條件語句 修飾符之前,您應該考慮三次。尤其是混合使用if/unless語句與 if/unless語句修飾符會降低代碼的可讀性。

在我看來,語句修飾符合理的主要情況 是簡單的錯誤路徑,即:

croak "foo not specified" unless exists $args{foo}; 
+0

我知道'do {} while'保證至少執行一次。這是否意味着'如果'會做同樣的事情? – Zaid 2010-06-29 10:28:12

+0

我剛試過。 'do {print「hello \ n」} if 0;'不會按預期打印任何內容。 – hillu 2010-06-29 10:37:34

3

comma operator允許一個鏈在一起的多個語句到表達,之後就可以包括條件:

$df{key} = 10, return if $result == 10; 

錯誤條件檢查當我使用此經常構造:

for my $foo (something...) 
{ 
    warn("invalid thing"), next unless $foo =~ /pattern/; 
    # ... 
} 
+4

不要忘記警告附近的括號,否則'警告'會吞噬'下一個'! – Zaid 2010-06-29 20:53:24

+0

@Zaid:好點!在我自己的代碼中,'warn'實際上是'$ this-> warn(...)'所以括號已經存在了...或者我會被這個:) – Ether 2010-06-29 23:26:19