2011-08-18 59 views

回答

13

一個區別是,for(1)套$ _到1的值,以及:

my $x = do { 1 }; # $x = 1 
my $y = for(1){ 1 }; # invalid 
5

for(1){ 
    print $_; # prints 1 
} 

此外,do序列中返回的最後一個命令的值關於一樣。

  • 您可以nextlastredo一個for循環,但do不是一個循環 - 包括作爲do的一部分 - while 「循環」。因此,在一個非平凡的區塊中,你無法確定。然而,這將工作:

    do {{ 
        ... 
    }}; 
    
  • 而且do不會自動設置$_到列表中,這樣的裸for循環意志的每個成員。

6

你可能真的只是尋找簡單的捲曲。

{ 
    print 1; 
} 

它具有以下優點:

  • 創建一個詞法範圍(如for (1)do {})。
  • 您可以在其中使用next,lastredo(如for (1))。
  • 它並不掩蓋$_(如do {})。

  • 它只能用在一份聲明中預期(如for (1),但不像do {})。

因此,{ ... }更有意義比for (1) { ... },而當你想返回一個值do { ... }是非常有用的。

+0

@asker,添加結論。 – ikegami

1

否。它們具有不同的編譯屬性並具有不同的效果。它們僅在一個維度上相似,因爲它們引入的代碼不會被循環 - 它們與其他結構(包括裸塊和(sub {...})->())有共同之處。

這裏有一個明顯的區別:for (LIST) BLOCK是一個循環,而do BLOCK是一個表達式。這意味着,

for (1) { 
    say "Blurgh" 
} unless 1; 

不能編譯,而

do { 
    say "Blurgh" 
} unless 1; 

一樣。