Perl:虽然没有条件

根据文档 ,只要expression式为真 , while语句就会执行该块。 我想知道为什么它变成一个空expression式的无限循环:

 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操作码被插入。 它什么都不做,但是为enterloop操作码提供了一个goto目标。 没有真正的理由注意到这一点。 由于parens不生成代码,所以Deparse使用空的parens表示这个stub操作。

这是“ 真实真理 ”概念的一个特例。 如果没有条件, 条件成立的陈述本身是真实的。

如果我正确地阅读这些内容,相关代码似乎在5.14.1中的op.c 5853行 :

 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 = listoplistop之前定义为listop = op_append_list(OP_LINESEQ, block, cont);

这是一个特例。 一个空的条件expression式默认为true ,意思是“永远循环,或者直到break 。在C(和perl)中,这个成语

 for(;;) { // Neverending fun } 

由于相同的原因具有相同的效果。

在官方的perl文档中似乎没有提到这一点,但在parsing器中有一个特殊的规则。 也许是因为没人用它:)

for(;;)成语虽然less见。