2011-11-15 24 views
5

在瀏覽CPAN,我在this module這難倒我對面的代碼塊來了。爲什麼在Perl中使用「do {} if」塊?

sub import { 
    for my $mod (keys %INC) { 
    do { 
     delete $INC{$mod}; 
     $mod =~ s/\.pm$//; $mod =~ s/\//::/g; 
     delete_package($mod); 
    } if $mod =~ m/^SOAP/; 
    } 
} 

爲什麼筆者使用do {} if塊代替常規if塊?

+6

Acme命名空間。你爲什麼期待健康? :) – Hugmeir

+4

我個人使用'爲我的$ mod(鍵%INC){下一個如果$ mod!〜/^SOAP /; ''。指定循環的標準,避免縮進級別作爲獎勵。 – ikegami

+0

@Hugmeir哈哈 - 這是一個完全有效的答案,你應該提交:) –

回答

4

因爲他們覺得喜歡它。沒有真正的區別。 Perl有十幾種方法來完成一切。這只是語言的方式。

+1

+1我總是喜歡聽到「爲什麼不呢?」。 – fncomp

1

因爲在Perl 「不止一種方法去做一件事」

2

對我來說,這似乎是一種方式來強調內部比if條件本身if更多的代碼

2

筆者想用的,如果在最後,但它是在一個聲明中沒有太多的結束。 A do {}是一個聲明,所以這將工作。

就個人而言,我會用if語句,但它是一個品味問題的重點是否應放在動作或狀態。在這種情況下,作者選擇強調這一行爲。

+0

(+1),我覺得很困惑寫「做的東西,如果一些-ELSE」,就像說「_I留在家裏**,每天**(除非它是一個工作一天)_」 – Gonen

5

一個區別是,do { ... }返回一個值,而一個if語句沒有(儘管看到下面的註釋)。

如:

my $x = 3; 
my $z = do { warn "in the do block"; 10 } if $x == 3; 

您幾乎可以完成同樣的事情三元運算符,但不能在三元運算符的分支內對語句進行排序。

+2

if語句做太多的回報值。由於語法有點棘手,你不能直接分配它們。但是如果你正確地嵌入它,你可以看到if正在返回一個值。這裏有一段代碼: 'my $ z = do {if($ x == 3){warn「in do block」; 10}}' 雖然你的代碼更簡潔,但我仍然認爲它是一個合理的答案,只是在技術上不完全正確。 –

+0

我同意 - 這是一個更正確的方式來看待這種情況。 – ErikR

+0

這兩個例子與Perl相同.... –

相關問題