2010-09-09 1 views
5

Quelqu'un peut-il m'expliquer s'il vous plaît le code ci-dessous. Ce comportement a été comme celui-ci pendant un certain temps (testé sur 5.8.5, 5.8.8, 5.10.1, 5.12.2) donc il doit y avoir une raison derrière cela?

$ perl -M5.012 -E '$aa=2' 
Global symbol "$aa" requires explicit package name at -e line 1. 

$ perl -M5.012 -E '$a=2' 

Merci.

+0

merci rafl et brian d foy, j'aurais dû re-vérifier perldoc strict en premier. – est

+0

N'hésitez pas à accepter l'une des réponses, même si vous devez lancer des dés. Cela fera 44% en dessous de votre nom un peu plus grand. :) –

Répondre

15

C'est dans la documentation strict:

En raison de leur utilisation particulière trier(), les variables $ a et $ b sont exemptés de cette vérification.

Toujours vérifier the docs. La plupart des réponses sont là :)

11

$a (et aussi $b, et beaucoup d'autres) est une variable globale. Il est destiné à être utilisé dans la fonction sort, par ex. sort { $a <=> $b } @list. perldoc perlvar répertorie tous les globals intégrés de perl et leur signification.

+2

En fait, je crois que $ a et $ b sont 'global globals' plutôt que globaux sur globals globaux (si cela a du sens). Voir [tri perldoc] (http://perldoc.perl.org/functions/sort.html) où il est écrit "... les éléments à comparer sont passés dans le sous-programme en tant que variables globales du paquet $ a et $ b. .. ". –

+0

Oui, ce sont des globals qui ne sont pas forcés dans l'espace de noms principal :: comme d'autres globals comme, par exemple, '$ _'. – rafl

Questions connexes