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.

10 réponses

1 2
Avatar
Paul GABORIT
À (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 ?

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


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 %::);

Pour un module particulier, disons 'Toto', la clé est 'Toto::' :

print join("n", keys %{$::{"Toto::"}});

Pour un module plus profond, disons 'Toto::Titi', il faut deux niveaux :

print join("n", keys %{$::{"Toto::"}{"Titi::"}});

À 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 ? 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.

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

Bon courage.

--
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

Avatar
Laurent Wacrenier
Alex Marandon écrit:
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 ?


Le mieux est de ranger ses variables dans un hash et d'exporter le
hash. Toutefois, tu peux te passer d'export et écrire ta propre
fonction import (perldoc -f import)

Avatar
nicolas
On Fri, 12 Sep 2003 18:08:55 +0200, 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



Pareil, ce sont des variables toutes connes.

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


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


Aaarg, c'est bien compliqué pour un fichier de config' (et en plus, j'y
pige rien).
Il faudrait juste faire comme si le code du fichier de conf' était
directement inséré là où il est appelé.
Et ça serait encore mieux si tout ça reconnaissait le ~ du répertoire
perso.

nicolas patrois : pts noir asocial
--
PEACE

M : La guerre, ça amène la mort, les épidémie, la vermine... la souffrance, la destruction, la peur...
P : ...Et les pacifistes !


Avatar
Alex Marandon
In article , Laurent Wacrenier wrote:
Alex Marandon écrit:
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 ?


Le mieux est de ranger ses variables dans un hash et d'exporter le
hash.


C'est aussi ce que je me suis dis après avoir semé mes scalaires un peu
partout dans une douzaine de fichier sources (et il jura mais un peu
tard qu'on ne l'y reprendrais plus).

Toutefois, tu peux te passer d'export et écrire ta propre
fonction import (perldoc -f import)


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.


Avatar
Alex Marandon
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
Alex Marandon
In article , nicolas wrote:
[...]
Il faudrait juste faire comme si le code du fichier de conf' était
directement inséré là où il est appelé.


Le proche de ce que vous dites, c'est la fonction do().

Et ça serait encore mieux si tout ça reconnaissait le ~ du répertoire
perso.


Vous trouverez le nom du répertoire personnel dans $ENV{'HOME'}.

$ cat y.pl
#!/usr/bin/perl -w
use strict;

our $a = "Plop!n";;



$ cat t.pl
#!/usr/bin/perl -w
use strict;

my $path = '~/y.pl';
$path =~ s/~/$ENV{'HOME'}/;
do $path;
print $a;

Avatar
Patrick
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 ?

Patrick.

Avatar
Alex Marandon
In article , Patrick 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.


Avatar
Samuel Mouniée
Bonjour,

Alex Marandon wrote:
In article , Patrick 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.


.s'nuoM



Avatar
nicolas
On Mon, 15 Sep 2003 10:41:46 +0200, Alex Marandon wrote:

do "$ENV{HOME}/lefichier";


Ça marche ! Merci.

nicolas patrois : pts noir asocial
--
PEACE

M : La guerre, ça amène la mort, les épidémie, la vermine... la souffrance, la destruction, la peur...
P : ...Et les pacifistes !

1 2