2011-08-18 66 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; 

一样。