根据doc,只要表达式为true,while
语句就会执行块。我想知道为什么它会变成一个带有空白表达式的死循环:Perl:尽管没有条件
while() { # infinite loop
...
}
这只是文档中的不准确吗?
根据doc,只要表达式为true,while
语句就会执行块。我想知道为什么它会变成一个带有空白表达式的死循环:Perl:尽管没有条件
while() { # infinite loop
...
}
这只是文档中的不准确吗?
$ perl -MO=Deparse -e 'while() { }'
while (1) {
();
}
-e syntax OK
看来while() {}
和while (1) {}
是等价的。另请注意,空白块插入空白块。
预先定义的编译器行为又如:
$ perl -MO=Deparse -e 'while (<>) { }'
while (defined($_ = <ARGV>)) {
();
}
-e syntax OK
我要说的是,这仅仅是不报的特殊情况的文档。
* —准确地说,插入了stub
操作码。它什么也没做,但是为操作码提供了一个goto目标。没有真正的理由注意到这一点。由于parens不生成代码,因此Deparse使用空的参数表示此stub
op。
奇怪的是,'for(;;)'也被解析为'while(1)'。 – 2012-04-26 14:33:59
@briandfoy是的,我注意到发布这个..后另一个特例。更奇怪的是'for()'是一个语法错误,但'for(())'编译,但不会编译到'while(1)'case中,而是'foreach $ _(())'。 – TLP 2012-04-26 14:43:12
@TLP不,最后一个是有道理的。 'for()'有两个我知道的语法:C风格和foreach over list。所以它不知道你想要哪一个。 (())'是对一个空数组的foreach:'perl -e'for(()){print“foo”;}'' – Izkata 2012-04-26 18:10:50
这是一个特例。空条件表达式默认为只是true
,这意味着“循环永远,或直到break
,在C(和perl)成语
for(;;) {
// Neverending fun
}
具有出于同样的原因相同的效果。
有没有按“T似乎是这个没有提到在官方Perl的文档,并且尚未有在解析器它一个特殊的规则。也许是因为没有人使用它:)
的for(;;)
成语不太少见,但。
如果是这样,它肯定需要在文档中提及。 – codaddict 2012-04-26 12:28:33
这是否记录在某处? – 2012-04-26 12:28:35
当然。有一些具体的东西被定义为false(0,“”,undef)。其他一切都默认为true。 – delicateLatticeworkFever 2012-04-26 12:31:14
这是Vacuous Truth这个概念的特殊情况。如果没有条件,条件为真的陈述本身就是真实的。
如果我正确地读这篇文章,相关的代码似乎是around line 5853 of op.c
在5.14.1:
5853 if (expr) {
5854 scalar(listop);
5855 o = new_logop(OP_AND, 0, &expr, &listop);
5856 if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) {
5857 op_free(expr); /* oops, it's a while (0) */
5858 op_free((OP*)loop);
5859 return NULL; /* listop already freed by new_logop */
5860 }
5861 if (listop)
5862 ((LISTOP*)listop)->op_last->op_next =
5863 (o == listop ? redo : LINKLIST(o));
5864 }
5865 else
5866 o = listop;
我跟在条件没有expr
假设,我们到达o = listop
。之前定义为listop
为listop = op_append_list(OP_LINESEQ, block, cont);
。
我不认为就是这样; o = listop可能是非循环'while(())'的情况。 while()'实际上是在解析器中实现的(perly.y);请参阅texpr规则,该规则不是(在这种情况下,它实际上假装它看到'1')或expr。 – ysth 2014-11-21 02:26:36
我更喜欢'while(1)'来强调意图。 – JRFerguson 2012-04-26 12:29:29