对于(1)总是与perl中的相同吗?

时间:2011-08-18 04:50:15

标签: perl

for(1){
  print 1;
}

do {
  print 1;
}

是真的吗?

或者这两个不相等有什么特殊情况吗?

4 个答案:

答案 0 :(得分:13)

一个区别是for(1)将$ _设置为1的值:

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

此外,do返回序列中最后一个命令的值:

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

答案 1 :(得分:6)

你可能真的在寻找简单的曲线。

{
   print 1;
}

它有以下好处:

  • 创建词汇范围(例如for (1)do {})。
  • 您可以在其中使用nextlastredo(例如for (1))。
  • 它不会屏蔽$_(例如do {})。

但是

  • 它只能用于需要声明的地方(例如for (1),但不像do {})。

因此,{ ... }for (1) { ... }更有意义,do { ... }在您想要返回值时非常有用。

答案 2 :(得分:5)

关于一样。

  • 您可以nextlastredo for循环,但do不是循环 - 包括作为其中一部分do - while“循环”。所以在一个非平凡的块中,你无法确定。但是,这将有效:

    do {{
        ...
    }};
    
  • 同样do不会自动为列表中的每个成员设置$_,就像裸for循环的方式一样。

答案 3 :(得分:1)

没有。它们具有不同的编译属性并具有不同的效果。它们只在一个维度上相似,即它们引入的代码不会被循环 - 它们与其他构造共有,包括裸块和(sub {...})->()

这是一个明显的区别:for (LIST) BLOCK是一个循环,而do BLOCK是一个表达式。这意味着

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

不编译,而

do {
    say "Blurgh"
} unless 1;

确实