J'exécute ActivePerl 5.14.2 32 bits d' ActiveState sur Windows 7. Je voulais jouer avec un crochet de pré-validation Git pour détecter les programmes en cours d'enregistrement avec des erreurs de syntaxe. (D'une manière ou d'une autre, j'ai juste réussi à faire un mauvais commit.) Donc, en tant que programme de test, j'ai noté au hasard ceci:
use strict;
use warnings;
Syntax error!
exit 0;
Cependant, il compile et s'exécute sans avertissement et le niveau d'erreur est nul à la sortie. Comment est cette syntaxe valide?
no indirect
empêcher ces événements de se produirewhatever / 25 ; # / ; die "this dies!";
Réponses:
Perl a une syntaxe appelée "notation de méthode indirecte". Il permet
être écrit comme
Donc ça signifie
est le même que
ou
Non seulement sa syntaxe est valide, mais elle n'entraîne pas d'erreur d'exécution car la première chose exécutée est
exit(0)
.la source
!exit(0)
ne peut pas plus être une erreur de type que!$x
puisque ni l'un ni l'autre ne sont tapés.new Class
etprint $fh ...
au lieu deClass->new(...)
et$fh->print(...)
. Je vous accorde que cela provoque des messages d'erreur étranges, cependantJe ne sais pas pourquoi, mais c'est ce que Perl en fait:
Il semble que l'analyseur pense que vous appelez la méthode
Syntax
sur leerror
-object ... Étrange en effet!la source
exit(0)
est évalué en premier, ce qui fait que le programme se termine avant d'essayer de transmettre le résultat à'error'->Syntax()
.new Class
au lieu deClass->new()
. Pour appeler la méthodeSyntax
, laexit
fonction est exécutée, donc l'erreur d'exécution ne se produit jamais.use strict; use warnings; error->Syntax(! print "hi");
Donne: Syntaxe Ok sur perl -MO = Deparse aussi, mais avecuse warnings
elle devrait probablement dire quelque chose car il peut comprendre que ce n'est pas en cours de chargement. Au lieu de cela, il génère une erreur d'exécution "Impossible de localiser la méthode d'objet ..".La raison pour laquelle vous n'obtenez pas d'erreur est que le premier code exécuté est
Parce que vous n'aviez pas de point-virgule sur la première ligne:
Le compilateur devinera (à tort) qu'il s'agit d'un appel de sous-programme avec un
not
opérateur!
ajouté. Il exécutera ensuite les arguments de ce sous-programme, qui se trouve êtreexit(0)
, à quel moment le programme se termine et définit le niveau d'erreur à 0. Rien d'autre n'est exécuté , donc plus aucune erreur d'exécution n'est signalée.Vous remarquerez que si vous passez
exit(0)
à quelque chose commeprint "Hello world!"
vous obtenez une erreur:et votre niveau d'erreur sera défini:
la source
>The compiler will guess (incorrectly)
Le compilateur ne peut rien faire de mal.Comme indiqué ci-dessus, cela est dû à la méthode indirecte appelant la notation. Vous pouvez avertir à ce sujet:
Produit:
Cela nécessite le module CPAN indirect .
Vous pouvez également utiliser
no indirect "fatal";
pour provoquer la mort du programme (c'est ce que je fais)la source
Essayez Perl 6 , il semble répondre plus facilement à vos attentes:
la source
TLDR; À peine
la source