sdf
est un bareword.
perl -Mstrict -e "print qq{defined\n} if defined sdf"
Bareword "sdf" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.
Pour plus de plaisir, essayez
perl -Mstrict -e "print sdf => qq{\n}"
Voir Strictly speaking about use strict:
Les sous-marins aspect de l'utilisation stricte désactive l'interprétation des `` mots nus '' comme des chaînes de texte . Par défaut, un identificateur Perl (une séquence de lettres, de chiffres et de traits de soulignement ne commençant pas par un chiffre sauf s'il est entièrement numérique) qui n'est pas un mot clé intégré ou une définition de sous-routine précédemment vue est traité comme une chaîne de texte
@daynames = (sun, mon, tue, wed, thu, fri, sat);
Cependant, cela est considéré comme une pratique dangereuse, parce que les bugs obscurs peuvent entraîner:
@monthnames = (jan, feb, mar, apr, may, jun,
jul, aug, sep, oct, nov, dec);
Pouvez-vous repérer le bug? Oui, la 10ème entrée n'est pas la chaîne 'oct', mais plutôt une invocation de la fonction oct()
intégrée, renvoyant l'équivalent numérique du $_
par défaut traité comme un nombre octal.
Correction: (@ysth thanks)
E:\Home> perl -we "print sdf"
Unquoted string "sdf" may clash with future reserved word at -e line 1.
Name "main::sdf" used only once: possible typo at -e line 1.
print() on unopened filehandle sdf at -e line 1.
Si un bareword est fourni à print
dans la fente d'objet indirect, il est pris comme descripteur de fichier à imprimer. Comme aucun autre argument n'est fourni, print
utilise par défaut $_
pour gérer le fichier sdf
. Puisque sdf
n'a pas été ouvert, il échoue. Si vous exécutez ceci sans avertissements, vous ne voyez aucune sortie. Notez également:
E:\Home> perl -MO=Deparse -e "print sdf"
print sdf $_;
comme confirmation de cette observation. A noter également:
E:\Home> perl -e "print asdfg, sadjkfsh"
No comma allowed after filehandle at -e line 1.
E:\Home> perl -e "print asdfg => sadjkfsh"
asdfgsadjkfsh
Ce dernier imprime les deux chaînes parce que =>
cite automatiquement les chaînes sur la LHS si elles sont composées uniquement de caractères « mot », en supprimant l'interprétation du filehandle premier argument.
Tous ces exemples montrent que l'utilisation de barewords entraîne de nombreuses surprises. Vous devriez use strict
pour éviter de tels cas.
@Aftershock: J'ai mis à jour ma réponse pour répondre au dernier problème que vous avez soulevé. –