OVH Cloud OVH Cloud

Export automatique de variables

13 réponses
Avatar
Alex Marandon
Bonjour,

J'ai un module "de configuration", qui contient des scalaires globaux
dont j'autorise l'importation via @EXPORT_OK. A chaque nouvelle
variable, je dois rajouter un entrée dans @EXPORT_OK, n'y aurait-il pas
moyen d'automatiser ça en contruisant dynamiquement @EXPORT_OK à laide
d'un inspection de la table des symboles ?

Je pense que ça doit être possible mais je ne connait pas les capacités
d'introspection de Perl.

Merci.

3 réponses

1 2
Avatar
Alex Marandon
In article <bk4adi$qhq$, Samuel Mouniée wrote:
J'ai beau relire les doc de Exporter, import et use, je ne comprends pas
comment s'implémente une fonction import. Je n'arrive pas à faire
fonctionner l'exemple qui est donné dans la doc de Exporter.


Peut-être un tour du côté du paragraphe ``Perl Modules'' du man perlmod ?



Pas mieux, à part l'explication sur le use(), équivalent à un require()
suivi d'un import(), je n'y vois pas d'information à propos de la
fonction import() et de la façon dont elle peut être écrite.


si vous voulez faire un "use monmodule qw( toto tata );", cela equivaut
bien a un "require monmodule.pm" et de monmodule->import( "toto", "tata" );

donc vous devez faire une fonction import dans le code de votre module.
elle aura la forme suivante :

sub import {
my ( $modulename_or_undef, @args ) = @_;

#moncode;

}

il n'y a pas de subtilite particulieres.


Bon décidément, j'ai du mal, voila ou j'en suis :

$ cat Te.pm
package Te;
use strict;
use warnings;
use base qw/Exporter/;

our $w = "Coucou";
our $x = "les";
our $y = "amis !";
our $z = "n";

sub import {
my ( $name, @args ) = @_;
foreach ( @args ) {
# ici je récupère bien mes valeurs
print ${$::{"Te::"}{"$_"}}, ' ';
# je veux les transférer dans main::
${$::{"main::"}{"$_"}} = ${$::{"Te::"}{"$_"}};
}
}

1;


$ cat t.pl
#!/usr/bin/perl -w
use strict;
use Te qw(w x y z);

# ne marche pas
print $w;

__END__




Avatar
Adrien Constant
ref() ?

Alex Marandon wrote:
In article , Paul GABORIT wrote:

À (at) Fri, 12 Sep 2003 17:12:17 +0200,
Alex Marandon écrivait (wrote):

J'ai un module "de configuration", qui contient des scalaires globaux
dont j'autorise l'importation via @EXPORT_OK. A chaque nouvelle
variable, je dois rajouter un entrée dans @EXPORT_OK, n'y aurait-il pas
moyen d'automatiser ça en contruisant dynamiquement @EXPORT_OK à laide
d'un inspection de la table des symboles ?



[...]

C'est sûrement faisable via la table des symboles : c'est une table de hachage
dont le nom est :: (deux fois deux points) ;-)

print join("n", keys %::);



[...]

À partir de là, on retrouve tous les symboles définis globalement (pas les
'my'). Mais comment comptez-vous distinguer ce qui faut exporter de ce qui ne
doit pas l'être ?



Effectivement, il y a du monde. Et je ne veux clairement pas exporter
tout ça.


De plus, vous n'avez accès qu'aux GLOB par ce moyen. Il faut
encore identifier ceux qui sont des scalaires ou autres choses.



Les variables que je veux exporter sont toutes des scalaires, mais ça ne
m'aide pas trop pour faire le tri dans tous les typeglobs que contient %::


Le plus simple est alors d'utiliser le module Symbol::Table (disponible sur
CPAN).

Bon courage.



Merci :)




Avatar
Paul GABORIT
À (at) Mon, 22 Sep 2003 09:47:40 +0200,
Adrien Constant écrivait (wrote):
ref() ?


???

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>
Remove '.OOO' from e-mail address - Supprimez '.OOO' de l'adresse e-mail

1 2