根據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