OVH Cloud OVH Cloud

typeglob: exemple basique qui ne fonctionne pas

4 réponses
Avatar
ctobini
Bonjour,

J'ai un petit probl=E8me avec les typeglobs que je suis en train de
d=E9couvrir :

J'ai essay=E9 le tout d=E9but de l'exemple de mon bouquin :

#!/usr/bin/env perl

use strict;

foreach my $nomsym(sort keys %main::) {
local *sym =3D $main::{$nomsym};
print "\$$nomsym is defined\n" if defined $sym
}

Qui me retourne une erreur :

Variable "$sym" is not imported at alias.pl line 10.
Global symbol "$sym" requires explicit package name at alias.pl line
10.
Execution of alias.pl aborted due to compilation errors.

Auriez-vous une suggestion sur ce blocage d=E8s le d=E9but :) ?

En vous remerciant,

C=2E Tobini

4 réponses

Avatar
Paul Gaborit
À (at) 28 Sep 2006 08:42:47 -0700,
"ctobini" écrivait (wrote):
J'ai un petit problème avec les typeglobs que je suis en train de
découvrir :

J'ai essayé le tout début de l'exemple de mon bouquin :

#!/usr/bin/env perl

use strict;

foreach my $nomsym(sort keys %main::) {
local *sym = $main::{$nomsym};
print "$$nomsym is definedn" if defined $sym
}

Qui me retourne une erreur :

Variable "$sym" is not imported at alias.pl line 10.
Global symbol "$sym" requires explicit package name at alias.pl line
10.
Execution of alias.pl aborted due to compilation errors.

Auriez-vous une suggestion sur ce blocage dès le début :) ?


Ajoutez une déclaration pour $sym ! Une ligne du genre :

our $sym;

Juste après 'use strict;' (c'est lui la "cause" de votre problème mias
heureusement puisqu'il est justement fait pour cela).

Lorsqu'on accède aux entrailles de la bête... heu... de Perl, les
mécanismes de protection automagique peuvent devenir génant.

PS: de quel bouquin sortez-vous cet exemple ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ctobini
Bonjour et merci de votre réponse,




Ajoutez une déclaration pour $sym ! Une ligne du genre après use stri ct :

our $sym;


C'est parfait, ça marche très bien !

Il y a cependant une chose que je ne comprend pas :

Si our $sym est déclarée en tant que variable (déclarée '$') du
paquetage et que fonction (local *sym) lui attribue une valeur propre
à la fonction, toujours selon le livre, comment attribuer un alias du
style :

*sym = *var

Afin que $sym = $var ou @sym = @var...

C. Tobini

Avatar
Paul Gaborit
À (at) 29 Sep 2006 05:12:51 -0700,
"ctobini" écrivait (wrote):
Il y a cependant une chose que je ne comprend pas :

Si our $sym est déclarée en tant que variable (déclarée '$') du
paquetage


Cette déclaration ne touche absolument pas aux valeurs. Elle ne fait
qu'informer le compilateur que le nom 'sym' est acceptable en tant que
variable scalaire (pour le paquetage courant). Si vous n'utilisez ni
'use strict' ni 'use warnings', les déclarations 'our' n'ont aucune
influence (ce n'est pas le cas de 'my').

et que fonction (local *sym) lui attribue une valeur propre
à la fonction, toujours selon le livre, comment attribuer un alias du
style :

*sym = *var

Afin que $sym = $var ou @sym = @var...


Là, on touche aux valeurs. Ou, dans le cas de l'alias, au lien qui est
fait entre un nom et ses différents types de valeurs.

Vous ajoutez en plus la notion de 'local'isation (temporelle) des
valeurs ce qui ne simplifient pas la compréhension.

Toutes ces notions sont complètement orthogonales...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
ctobini
Bonjour,

J'ai fait plusieurs tests, c'est plus clair, sauf pour les attributions
*this = *that, il faudra que je creuse un peu plus.

Merci en tout cas pour votre aide.

J'ai oublié de vous répondre pour la provenance de ces exemples,
c'est tiré de l'ouvrage 'Programmation en Perl' O'Reilly (3ème Ed.,
p.67).

Bonne journée,

C. Tobini

--------------------------


À (at) 29 Sep 2006 05:12:51 -0700,
"ctobini" écrivait (wrote):
Il y a cependant une chose que je ne comprend pas :

Si our $sym est déclarée en tant que variable (déclarée '$') du
paquetage


Cette déclaration ne touche absolument pas aux valeurs. Elle ne fait
qu'informer le compilateur que le nom 'sym' est acceptable en tant que
variable scalaire (pour le paquetage courant). Si vous n'utilisez ni
'use strict' ni 'use warnings', les déclarations 'our' n'ont aucune
influence (ce n'est pas le cas de 'my').

et que fonction (local *sym) lui attribue une valeur propre
à la fonction, toujours selon le livre, comment attribuer un alias du
style :

*sym = *var

Afin que $sym = $var ou @sym = @var...


Là, on touche aux valeurs. Ou, dans le cas de l'alias, au lien qui est
fait entre un nom et ses différents types de valeurs.

Vous ajoutez en plus la notion de 'local'isation (temporelle) des
valeurs ce qui ne simplifient pas la compréhension.

Toutes ces notions sont complètement orthogonales...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>