2012-04-26 56 views
42

根据doc,只要表达式为truewhile语句就会执行块。我想知道为什么它会变成一个带有空白表达式的死循环:Perl:尽管没有条件

while() { # infinite loop 
... 
} 

这只是文档中的不准确吗?

+5

我更喜欢'while(1)'来强调意图。 – JRFerguson 2012-04-26 12:29:29

回答

34
$ 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。

+12

奇怪的是,'for(;;)'也被解析为'while(1)'。 – 2012-04-26 14:33:59

+3

@briandfoy是的,我注意到发布这个..后另一个特例。更奇怪的是'for()'是一个语法错误,但'for(())'编译,但不会编译到'while(1)'case中,而是'foreach $ _(())'。 – TLP 2012-04-26 14:43:12

+0

@TLP不,最后一个是有道理的。 'for()'有两个我知道的语法:C风格和foreach over list。所以它不知道你想要哪一个。 (())'是对一个空数组的foreach:'perl -e'for(()){print“foo”;}'' – Izkata 2012-04-26 18:10:50

11

这是一个特例。空条件表达式默认为只是true,这意味着“循环永远,或直到break,在C(和perl)成语

for(;;) { 
    // Neverending fun 
} 

具有出于同样的原因相同的效果。

有没有按“T似乎是这个没有提到在官方Perl的文档,并且尚未有在解析器它一个特殊的规则。也许是因为没有人使用它:)

for(;;)成语不太少见,但。

+4

如果是这样,它肯定需要在文档中提及。 – codaddict 2012-04-26 12:28:33

+0

这是否记录在某处? – 2012-04-26 12:28:35

+1

当然。有一些具体的东西被定义为false(0,“”,undef)。其他一切都默认为true。 – delicateLatticeworkFever 2012-04-26 12:31:14

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

+1

我不认为就是这样; o = listop可能是非循环'while(())'的情况。 while()'实际上是在解析器中实现的(perly.y);请参阅texpr规则,该规则不是(在这种情况下,它实际上假装它看到'1')或expr。 – ysth 2014-11-21 02:26:36

相关问题