2012-04-26 108 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

相關問題