Selon la doc, le while
instruction exécute le bloc tant que l'expression est vrai. Je me demande pourquoi il devient une boucle infinie avec un vide d'expression:
while () { # infinite loop
...
}
C'est juste de l'inexactitude dans la doc?
- Je préfère
while (1)
de souligner l'intention.
Il semble que
while () {}
etwhile (1) {}
sont équivalentes. Notez également que vide parens* sont insérés dans le bloc vide.Un autre exemple de pré-définies comportement du compilateur:
Je dirais que c'est juste les docs pas de déclaration d'un cas particulier.
* — Pour être précis, le
stub
opcode est inséré. Il ne fait rien, mais sert un goto cible pour laenterloop
opcode. Il n'y a pas de véritable raison pour note ce. Deparse indique cestub
op vide à l'aide de parenthèses, depuis parens ne pas générer du code.for(;;)
deparses commewhile(1)
trop.for ()
est une erreur de syntaxe, maisfor (())
compile, mais ne compile pas dans lewhile(1)
cas, maisforeach $_ (())
.for ()
a deux syntaxes je connais: C-style et foreach sur la liste. Donc il ne sais pas ce que vous voulez.for (())
est un foreach sur un tableau vide:perl -e 'for (()) { print "foo" ;}'
[]
.for
est tout simplement un alias pourforeach
, ils sont interchangeables. La partie la plus curieuse est quewhile()
etfor(;;)
sont considérés comme des boucles infinies,for(())
n'est pas, même si sa condition de boucle est également vide.for(())
est redondant instruction, comme il ne sera jamais exécuter.[]
et()
confondre à l'occasion. Mais de mon point de vue général, est encore debout -for (())
n'est pas vide commewhile ()
, même si je suis d'accord, il semble un peu bizarre qu'il n'est pas juste enlevé.1
est ajouté par Deparse, pas le compilateur.while (1) { }
etwhile () { }
compiler le même code, de sorte Deparse a pour Deparse les mêmes, et il a choisi de deparse pour le moins déroutantwhile (1) { }
. Si vous regardez le code produit (-MO=Concise
), vous allez voir il n'y a pas de1
ajouté. Il n'y a pas de condition à tous, en fait. Le1
devient supprimé pourwhile (1) { }
.for (;;) { ... }
,while () { ... }
etwhile (TRUE) { ... }
compiler à une condition-moins de boucle (loop { ... }
). Deparse a aucun moyen de savoir ce que le code d'origine a été.C'est un cas particulier de la notion de Vides De Sens, De Vérité. Si il n'y a pas de condition, la déclaration alors que la condition est vraie est lui-même vacuously vrai.
Si je lis bien, le morceau de code semble être autour de la ligne 5853 de
op.c
dans 5.14.1:Je suis en supposant que sans
expr
en l'état, nous arrivons ào = listop
.listop
a été défini précédemment commelistop = op_append_list(OP_LINESEQ, block, cont);
.while(())
cas.while()
est réellement mis en œuvre dans l'analyseur (perly.y); voir la texpr règle, qui est soit rien (dans ce cas, il littéralement prétend qu'il a vu un '1') ou d'une expr.C'est un cas particulier. Un vide expression de condition par défaut est juste
true
, qui signifie "boucle à l'infini, jusqu'à ce qu'unbreak
. En C et perl) l'idiomea le même effet pour la même raison.
Il ne semble y avoir aucune mention de cela dans le perl officiel docs, et pourtant, il y a une règle spéciale dans l'analyseur pour elle. C'est peut-être parce que personne ne l'utilise 🙂
La
for(;;)
idiome est moins rare cependant.for (;;) { ... }
etwhile () { ... }
sont les boucles infinies.