for(1){
print 1;
}
do {
print 1;
}
是真的吗?
或者这两个不相等有什么特殊情况吗?
答案 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 {}
)。next
,last
和redo
(例如for (1)
)。$_
(例如do {}
)。但是
for (1)
,但不像do {}
)。因此,{ ... }
比for (1) { ... }
更有意义,do { ... }
在您想要返回值时非常有用。
答案 2 :(得分:5)
关于一样。
您可以next
,last
和redo
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;
确实