j'ai une question assez simple : j'aimerai inclure le contenu d'un
script perl, dans un autre script perl, un peu comme avec un
#include en langage C, ou require() en php.
Comment puis-je faire cela ?
J'ai bien sur parcouru la doc en ligne de perl, cependant, j'ai un
gros probleme avec : je trouve qu'il est parfois assez dur d'y trouver
une information precise, comme ma question au-dessus.
J'y trouve bien potentiellement des solutions à base de créations de
modules perl, mais j'aimerai éviter ça, ne voulant pas forcément
inclure des fonctions, mais plutôt définir des variables globales dans
un fichier externe au fichier principal.
Non malheureusement... tes variables ne seront valables que dans l'espace où elles auront été déclarées (le fichier de variables). Pour les appeler, tu as différentes façon mais rien de direct. Hélas.
D'accord, et c'est bien dommage... Si vos différentes façons ne font pas appels à des modules, pourriez-vous en donner quelques-unes ?
Je vais me mettre à l'étude des modules (man perlmod :-) ) pour essayer de m'en sortir, mais si jamais il y a d'autres moyens, je suis preneur, merci !
Si j'ai bien compris, le but était d'avoir un fichier contenant toutes les variables communes à plusieurs fichiers. Comme on l'a déjà dit, le seul moyen est d'utiliser 'use' ou 'require' sur un fichier (lequel n'est pas forcément un module, voir exemple ci-dessous). La solution donnée par Patrice dans une réponse à ce message est de définir complètement la variable ($monfichier::variable) et comme il le dit c'est lourd. Je propose une autre solution, qui consiste à utiliser 'our' (disponible au moins depuis 5.6.x), ce qui évite d'avoir à qualifier complètement la variable. Il y a bien entendu un inconvénient (une autre lourdeur), c'est d'avoir à répéter toutes les définitions 'our' dans tous les fichiers qui les utilisent, mais on sera vite averti de l'absence d'une variable à condition d'utiliser 'warnings' et 'strict'.
Exemple :
---- principal.pl ---- use warnings; use strict;
require "secondaire";
our $var; # à répéter dans tous les fichiers qui y font référence
Non malheureusement... tes variables ne seront valables que dans
l'espace où elles auront été déclarées (le fichier de variables). Pour
les appeler, tu as différentes façon mais rien de direct. Hélas.
D'accord, et c'est bien dommage...
Si vos différentes façons ne font pas appels à des modules,
pourriez-vous en donner quelques-unes ?
Je vais me mettre à l'étude des modules (man perlmod :-) ) pour
essayer de m'en sortir, mais si jamais il y a d'autres moyens, je suis
preneur, merci !
Si j'ai bien compris, le but était d'avoir un fichier contenant toutes
les variables communes à plusieurs fichiers. Comme on l'a déjà dit, le
seul moyen est d'utiliser 'use' ou 'require' sur un fichier (lequel
n'est pas forcément un module, voir exemple ci-dessous).
La solution donnée par Patrice dans une réponse à ce message est de
définir complètement la variable ($monfichier::variable) et comme il
le dit c'est lourd.
Je propose une autre solution, qui consiste à utiliser 'our'
(disponible au moins depuis 5.6.x), ce qui évite d'avoir à qualifier
complètement la variable. Il y a bien entendu un inconvénient (une
autre lourdeur), c'est d'avoir à répéter toutes les définitions 'our'
dans tous les fichiers qui les utilisent, mais on sera vite averti de
l'absence d'une variable à condition d'utiliser 'warnings' et
'strict'.
Exemple :
---- principal.pl ----
use warnings;
use strict;
require "secondaire";
our $var; # à répéter dans tous les fichiers qui y font référence
Non malheureusement... tes variables ne seront valables que dans l'espace où elles auront été déclarées (le fichier de variables). Pour les appeler, tu as différentes façon mais rien de direct. Hélas.
D'accord, et c'est bien dommage... Si vos différentes façons ne font pas appels à des modules, pourriez-vous en donner quelques-unes ?
Je vais me mettre à l'étude des modules (man perlmod :-) ) pour essayer de m'en sortir, mais si jamais il y a d'autres moyens, je suis preneur, merci !
Si j'ai bien compris, le but était d'avoir un fichier contenant toutes les variables communes à plusieurs fichiers. Comme on l'a déjà dit, le seul moyen est d'utiliser 'use' ou 'require' sur un fichier (lequel n'est pas forcément un module, voir exemple ci-dessous). La solution donnée par Patrice dans une réponse à ce message est de définir complètement la variable ($monfichier::variable) et comme il le dit c'est lourd. Je propose une autre solution, qui consiste à utiliser 'our' (disponible au moins depuis 5.6.x), ce qui évite d'avoir à qualifier complètement la variable. Il y a bien entendu un inconvénient (une autre lourdeur), c'est d'avoir à répéter toutes les définitions 'our' dans tous les fichiers qui les utilisent, mais on sera vite averti de l'absence d'une variable à condition d'utiliser 'warnings' et 'strict'.
Exemple :
---- principal.pl ---- use warnings; use strict;
require "secondaire";
our $var; # à répéter dans tous les fichiers qui y font référence
our $var; # à répéter dans tous les fichiers qui y font référence
sub plusdix { $var += 10; }
1; ---- secondaire ----
résultat : avant principal: 0 après principal, avant secondaire : 1 après &plusdix : 11
Mais si je dis des bêtises, je ne demande qu'à apprendre JPV
Jedaï
Grmbl... Il y a une façon bien plus simple de faire ça : c'est d'utiliser le module export, il est fait pour ça... :)
Exemple pour un fichier de variable : -Fichier ./Locvars.pm
package Locvars; require Exporter;
our @ISA = qw(Exporter); #liste des variables à exporter dans l'espace "main" our @EXPORT = qw($MaVar1 @MaVar2);
our ($MaVar1, @MaVar2) = ("Hello World !", "Vive", "Perl !n");
1;
-Fichier ./Hello.pl
#!perl use strict; use warnings;
#pour que Perl cherche aussi les modules dans le répertoire courant : use lib "."; use Locvars;
print $MaVar1, "n"; print join " ", @MaVar2;
C'est quand même pas si lourd que ça, non ? (4 lignes à rajouter au début de ton fichier de variables, et un use au début du script) ;) (En plus, il y a un tas d'autres possibilités si on utilise Exporter)
Grmbl...
Il y a une façon bien plus simple de faire ça : c'est d'utiliser le
module export, il est fait pour ça... :)
Exemple pour un fichier de variable :
-Fichier ./Locvars.pm
package Locvars;
require Exporter;
our @ISA = qw(Exporter);
#liste des variables à exporter dans l'espace "main"
our @EXPORT = qw($MaVar1 @MaVar2);
our ($MaVar1, @MaVar2) = ("Hello World !", "Vive", "Perl !n");
1;
-Fichier ./Hello.pl
#!perl
use strict;
use warnings;
#pour que Perl cherche aussi les modules dans le répertoire courant :
use lib ".";
use Locvars;
print $MaVar1, "n";
print join " ", @MaVar2;
C'est quand même pas si lourd que ça, non ? (4 lignes à rajouter au
début de ton fichier de variables, et un use au début du script) ;)
(En plus, il y a un tas d'autres possibilités si on utilise Exporter)
Grmbl... Il y a une façon bien plus simple de faire ça : c'est d'utiliser le module export, il est fait pour ça... :)
Exemple pour un fichier de variable : -Fichier ./Locvars.pm
package Locvars; require Exporter;
our @ISA = qw(Exporter); #liste des variables à exporter dans l'espace "main" our @EXPORT = qw($MaVar1 @MaVar2);
our ($MaVar1, @MaVar2) = ("Hello World !", "Vive", "Perl !n");
1;
-Fichier ./Hello.pl
#!perl use strict; use warnings;
#pour que Perl cherche aussi les modules dans le répertoire courant : use lib "."; use Locvars;
print $MaVar1, "n"; print join " ", @MaVar2;
C'est quand même pas si lourd que ça, non ? (4 lignes à rajouter au début de ton fichier de variables, et un use au début du script) ;) (En plus, il y a un tas d'autres possibilités si on utilise Exporter)
Patrice Karatchentzeff
Jedaï writes:
C'est quand même pas si lourd que ça, non ? (4 lignes à rajouter au début de ton fichier de variables, et un use au début du script) ;) (En plus, il y a un tas d'autres possibilités si on utilise Exporter)
Ce n'est pas extrêmement lourd, comme toutes les autres méthodes précitées. Cela va juste à l'encontre de l'efficacité qui consiste (ici) à taper deux fois les variables dans le même fichier, ce qui est nul tout simplement (sans compter le risque d'en oublier dans la manip).
J'avoue qu'une fonction du genre 'global' avec
global $toto ;
qui rendrait $toto global au programme *entièrement* serait bien plus naturel (et donc par extension bien plus perlien) à utiliser.
C'est quand même pas si lourd que ça, non ? (4 lignes à rajouter au
début de ton fichier de variables, et un use au début du script) ;)
(En plus, il y a un tas d'autres possibilités si on utilise
Exporter)
Ce n'est pas extrêmement lourd, comme toutes les autres méthodes
précitées. Cela va juste à l'encontre de l'efficacité qui consiste
(ici) à taper deux fois les variables dans le même fichier, ce qui est
nul tout simplement (sans compter le risque d'en oublier dans la
manip).
J'avoue qu'une fonction du genre 'global' avec
global $toto ;
qui rendrait $toto global au programme *entièrement* serait bien plus
naturel (et donc par extension bien plus perlien) à utiliser.
C'est quand même pas si lourd que ça, non ? (4 lignes à rajouter au début de ton fichier de variables, et un use au début du script) ;) (En plus, il y a un tas d'autres possibilités si on utilise Exporter)
Ce n'est pas extrêmement lourd, comme toutes les autres méthodes précitées. Cela va juste à l'encontre de l'efficacité qui consiste (ici) à taper deux fois les variables dans le même fichier, ce qui est nul tout simplement (sans compter le risque d'en oublier dans la manip).
J'avoue qu'une fonction du genre 'global' avec
global $toto ;
qui rendrait $toto global au programme *entièrement* serait bien plus naturel (et donc par extension bien plus perlien) à utiliser.
AMHA, c'est vraiment la seule limite de Perl qui va à l'encontre du but de Larry Wall qui consiste à fournir un outil permettant de s'adapter aux besoins du codeur (et non l'inverse).
Je ne comprends pas pourtant, c'est quelque chose de simple à faire, en soit. Si ça n'a pas été fait, c'est qu'il y a bien une raison... Mais laquelle ?
Sais pas mais je serai bien curieux de savoir... J'ai failli envoyer un courriel à LW il y a quelques mois là-dessus... et puis, je me suis raviser : si ce n'est pas fait, c'est qu'il doit bien y avoir une raison valable.
http://alpage.org/static_html/Les_espaces_de_nom.html c'est instructif, sur le _pourquoi_ et sur le _comment_
AMHA, c'est vraiment la seule limite de Perl qui va à l'encontre du
but de Larry Wall qui consiste à fournir un outil permettant de
s'adapter aux besoins du codeur (et non l'inverse).
Je ne comprends pas pourtant, c'est quelque chose de simple à faire,
en soit. Si ça n'a pas été fait, c'est qu'il y a bien une
raison... Mais laquelle ?
Sais pas mais je serai bien curieux de savoir... J'ai failli envoyer
un courriel à LW il y a quelques mois là-dessus... et puis, je me suis
raviser : si ce n'est pas fait, c'est qu'il doit bien y avoir une
raison valable.
http://alpage.org/static_html/Les_espaces_de_nom.html
c'est instructif, sur le _pourquoi_ et sur le _comment_
AMHA, c'est vraiment la seule limite de Perl qui va à l'encontre du but de Larry Wall qui consiste à fournir un outil permettant de s'adapter aux besoins du codeur (et non l'inverse).
Je ne comprends pas pourtant, c'est quelque chose de simple à faire, en soit. Si ça n'a pas été fait, c'est qu'il y a bien une raison... Mais laquelle ?
Sais pas mais je serai bien curieux de savoir... J'ai failli envoyer un courriel à LW il y a quelques mois là-dessus... et puis, je me suis raviser : si ce n'est pas fait, c'est qu'il doit bien y avoir une raison valable.
http://alpage.org/static_html/Les_espaces_de_nom.html c'est instructif, sur le _pourquoi_ et sur le _comment_
-- dominix
dominix
Patrice Karatchentzeff wrote:
Vincent Hiribarren writes:
Patrice Karatchentzeff writes:
[..]
AMHA, c'est vraiment la seule limite de Perl qui va à l'encontre du but de Larry Wall qui consiste à fournir un outil permettant de s'adapter aux besoins du codeur (et non l'inverse).
Je ne comprends pas pourtant, c'est quelque chose de simple à faire, en soit. Si ça n'a pas été fait, c'est qu'il y a bien une raison... Mais laquelle ?
Sais pas mais je serai bien curieux de savoir... J'ai failli envoyer un courriel à LW il y a quelques mois là-dessus... et puis, je me suis raviser : si ce n'est pas fait, c'est qu'il doit bien y avoir une raison valable.
http://groups.google.com/groups?selm il y a la aussi une explication interessante.
AMHA, c'est vraiment la seule limite de Perl qui va à l'encontre du
but de Larry Wall qui consiste à fournir un outil permettant de
s'adapter aux besoins du codeur (et non l'inverse).
Je ne comprends pas pourtant, c'est quelque chose de simple à faire,
en soit. Si ça n'a pas été fait, c'est qu'il y a bien une
raison... Mais laquelle ?
Sais pas mais je serai bien curieux de savoir... J'ai failli envoyer
un courriel à LW il y a quelques mois là-dessus... et puis, je me suis
raviser : si ce n'est pas fait, c'est qu'il doit bien y avoir une
raison valable.
http://groups.google.com/groups?selm 031128214751.GA5228@fdgroup.com
il y a la aussi une explication interessante.
AMHA, c'est vraiment la seule limite de Perl qui va à l'encontre du but de Larry Wall qui consiste à fournir un outil permettant de s'adapter aux besoins du codeur (et non l'inverse).
Je ne comprends pas pourtant, c'est quelque chose de simple à faire, en soit. Si ça n'a pas été fait, c'est qu'il y a bien une raison... Mais laquelle ?
Sais pas mais je serai bien curieux de savoir... J'ai failli envoyer un courriel à LW il y a quelques mois là-dessus... et puis, je me suis raviser : si ce n'est pas fait, c'est qu'il doit bien y avoir une raison valable.
http://groups.google.com/groups?selm il y a la aussi une explication interessante.
bon{,ne} [nuit|jour] -- dominix
jeanpierre.vidal
"dominix" <dominix"at"despammed.com> wrote in message news:<3feff9d8$0$29089$...
Patrice Karatchentzeff wrote:
[snip]
http://groups.google.com/groups?selm il y a la aussi une explication interessante.
bon{,ne} [nuit|jour] -- dominix
C'est très intéressant, mais : pourquoi le fil original "[Debutant] Inclure un script dans un autre script" a-t-il disparu ? (ou comment ?) JPV
"dominix" <dominix"at"despammed.com> wrote in message news:<3feff9d8$0$29089$636a55ce@news.free.fr>...
Patrice Karatchentzeff wrote:
[snip]
http://groups.google.com/groups?selm 031128214751.GA5228@fdgroup.com
il y a la aussi une explication interessante.
bon{,ne} [nuit|jour]
--
dominix
C'est très intéressant, mais : pourquoi le fil original "[Debutant]
Inclure un script dans un autre script" a-t-il disparu ? (ou comment
?)
JPV
"dominix" <dominix"at"despammed.com> wrote in message news:<3feff9d8$0$29089$...
Patrice Karatchentzeff wrote:
[snip]
http://groups.google.com/groups?selm il y a la aussi une explication interessante.
C'est très intéressant, mais : pourquoi le fil original "[Debutant] Inclure un script dans un autre script" a-t-il disparu ? (ou comment
il a pas disparu, il a changé avec le changement de sujet :-)
-- bon{,ne} [nuit|jour] dominix
Patrice Karatchentzeff
"dominix" <dominix"at"despammed.com> writes:
Patrice Karatchentzeff wrote:
[...]
Sais pas mais je serai bien curieux de savoir... J'ai failli envoyer un courriel à LW il y a quelques mois là-dessus... et puis, je me suis raviser : si ce n'est pas fait, c'est qu'il doit bien y avoir une raison valable.
http://alpage.org/static_html/Les_espaces_de_nom.html c'est instructif, sur le _pourquoi_ et sur le _comment_
Moui : je connaissais.
*Mais* cela n'est pas instructif sur le vrai pourquoi... Je pense que c'est dû à une limitation des origines, qui faisait que le Perl original n'était qu'un shell (amélioré) de plus, et surtout pas spécialement destiné à être codé dans de multiples fichiers.
Ensuite, sont venus les modules pour régler proprement un certain nombre de concepts mais qui a eu le « malheur » d'oublier en cours le concept fondamental de Perl : rendre les choses simples faciles...
Tiens, j'y pense, il suffirait de fabriquer une fonction export qui passerait la main au module exporter pour résoudre assez facilement notre problème. Un truc du genre :
Sais pas mais je serai bien curieux de savoir... J'ai failli envoyer
un courriel à LW il y a quelques mois là-dessus... et puis, je me suis
raviser : si ce n'est pas fait, c'est qu'il doit bien y avoir une
raison valable.
http://alpage.org/static_html/Les_espaces_de_nom.html
c'est instructif, sur le _pourquoi_ et sur le _comment_
Moui : je connaissais.
*Mais* cela n'est pas instructif sur le vrai pourquoi... Je pense que
c'est dû à une limitation des origines, qui faisait que le Perl
original n'était qu'un shell (amélioré) de plus, et surtout pas
spécialement destiné à être codé dans de multiples fichiers.
Ensuite, sont venus les modules pour régler proprement un certain
nombre de concepts mais qui a eu le « malheur » d'oublier en cours le
concept fondamental de Perl : rendre les choses simples faciles...
Tiens, j'y pense, il suffirait de fabriquer une fonction export qui
passerait la main au module exporter pour résoudre assez facilement
notre problème. Un truc du genre :
Sais pas mais je serai bien curieux de savoir... J'ai failli envoyer un courriel à LW il y a quelques mois là-dessus... et puis, je me suis raviser : si ce n'est pas fait, c'est qu'il doit bien y avoir une raison valable.
http://alpage.org/static_html/Les_espaces_de_nom.html c'est instructif, sur le _pourquoi_ et sur le _comment_
Moui : je connaissais.
*Mais* cela n'est pas instructif sur le vrai pourquoi... Je pense que c'est dû à une limitation des origines, qui faisait que le Perl original n'était qu'un shell (amélioré) de plus, et surtout pas spécialement destiné à être codé dans de multiples fichiers.
Ensuite, sont venus les modules pour régler proprement un certain nombre de concepts mais qui a eu le « malheur » d'oublier en cours le concept fondamental de Perl : rendre les choses simples faciles...
Tiens, j'y pense, il suffirait de fabriquer une fonction export qui passerait la main au module exporter pour résoudre assez facilement notre problème. Un truc du genre :
C'est quand même pas si lourd que ça, non ? (4 lignes à rajouter au début de ton fichier de variables, et un use au début du script) ;) (En plus, il y a un tas d'autres possibilités si on utilise Exporter)
Ce n'est pas extrêmement lourd, comme toutes les autres méthodes précitées. Cela va juste à l'encontre de l'efficacité qui consiste (ici) à taper deux fois les variables dans le même fichier, ce qui est nul tout simplement (sans compter le risque d'en oublier dans la manip).
J'avoue qu'une fonction du genre 'global' avec
global $toto ;
qui rendrait $toto global au programme *entièrement* serait bien plus naturel (et donc par extension bien plus perlien) à utiliser.
C'est tout ;-)
PK
Je n'aime pas trop l'idée pour des raisons de portabilité, ce "global" serait vraiment un truc pour faire sa petite cuisine dans son coin, parce que tu ne laisse aucun contrôle à l'utilisateur final, s'il n'est pas toi, sur ce qu'il veut importer... Et ce peut être génant, cf conflit entre les noms de variable. Néanmoins, si tu veux faire un module de variable uniquement et que tu n'as pas peur des conflits (vu que tu es le seul à l'utiliser et que tu es sûr de ne pas te tromper...), tu peux faire un bidouillage comme ça je pense :
package Locvars; require Exporter;
our @ISA = qw(Exporter); #liste des variables à exporter dans l'espace "main" our @EXPORT;
our ($MaVar1, @MaVar2) = ("Hello World !", "Vive", "Perl !n");
sub magic_list{ my $packname = __PACKAGE__; foreach $name(keys %{"${packname}::"}){ local *sym = ${"${packname}::"}{$name}; push @EXPORT, "$$name" if defined $sym; push @EXPORT, "@$name" if( defined @sym and $name ne "EXPORT" and $name ne "ISA" ); push @EXPORT, "%$name" if defined %sym; } } magic_list; 1;
Ce qui exportera toutes les variables de ton paquetage dans l'espace de nom "main::", tu peux aussi faire ta routine "global" ainsi : (ça marche uniquement pour les scalaires) sub exportons { push @EXPORT, "$$_[0]"; my $nomdevar = $_[0]; $$nomdevar = $_[1]; return $$nomdevar; }
tu peux alors l'employer comme ça : exportons "Hello", "Hello World";
(Tu peux l'étendre pour te permettre d'exporter des tableaux ou des hashs, ça n'est pas bien dur.) A toi de voir si ça en vaut vraiment la peine, ou si tu veux carrément réécrire le module Exporter de 0, ce qui est peut-être une meilleure idée...
Patrice Karatchentzeff wrote:
Jedaï <chaddai@wanadoo.fr> writes:
C'est quand même pas si lourd que ça, non ? (4 lignes à rajouter au
début de ton fichier de variables, et un use au début du script) ;)
(En plus, il y a un tas d'autres possibilités si on utilise
Exporter)
Ce n'est pas extrêmement lourd, comme toutes les autres méthodes
précitées. Cela va juste à l'encontre de l'efficacité qui consiste
(ici) à taper deux fois les variables dans le même fichier, ce qui est
nul tout simplement (sans compter le risque d'en oublier dans la
manip).
J'avoue qu'une fonction du genre 'global' avec
global $toto ;
qui rendrait $toto global au programme *entièrement* serait bien plus
naturel (et donc par extension bien plus perlien) à utiliser.
C'est tout ;-)
PK
Je n'aime pas trop l'idée pour des raisons de portabilité, ce "global"
serait vraiment un truc pour faire sa petite cuisine dans son coin,
parce que tu ne laisse aucun contrôle à l'utilisateur final, s'il n'est
pas toi, sur ce qu'il veut importer... Et ce peut être génant, cf
conflit entre les noms de variable.
Néanmoins, si tu veux faire un module de variable uniquement et que tu
n'as pas peur des conflits (vu que tu es le seul à l'utiliser et que tu
es sûr de ne pas te tromper...), tu peux faire un bidouillage comme ça
je pense :
package Locvars;
require Exporter;
our @ISA = qw(Exporter);
#liste des variables à exporter dans l'espace "main"
our @EXPORT;
our ($MaVar1, @MaVar2) = ("Hello World !", "Vive", "Perl !n");
sub magic_list{
my $packname = __PACKAGE__;
foreach $name(keys %{"${packname}::"}){
local *sym = ${"${packname}::"}{$name};
push @EXPORT, "$$name" if defined $sym;
push @EXPORT, "@$name" if( defined @sym and $name ne "EXPORT"
and $name ne "ISA" );
push @EXPORT, "%$name" if defined %sym;
}
}
magic_list;
1;
Ce qui exportera toutes les variables de ton paquetage dans l'espace de
nom "main::", tu peux aussi faire ta routine "global" ainsi :
(ça marche uniquement pour les scalaires)
sub exportons {
push @EXPORT, "$$_[0]";
my $nomdevar = $_[0];
$$nomdevar = $_[1];
return $$nomdevar;
}
tu peux alors l'employer comme ça :
exportons "Hello", "Hello World";
(Tu peux l'étendre pour te permettre d'exporter des tableaux ou des
hashs, ça n'est pas bien dur.)
A toi de voir si ça en vaut vraiment la peine, ou si tu veux carrément
réécrire le module Exporter de 0, ce qui est peut-être une meilleure idée...
C'est quand même pas si lourd que ça, non ? (4 lignes à rajouter au début de ton fichier de variables, et un use au début du script) ;) (En plus, il y a un tas d'autres possibilités si on utilise Exporter)
Ce n'est pas extrêmement lourd, comme toutes les autres méthodes précitées. Cela va juste à l'encontre de l'efficacité qui consiste (ici) à taper deux fois les variables dans le même fichier, ce qui est nul tout simplement (sans compter le risque d'en oublier dans la manip).
J'avoue qu'une fonction du genre 'global' avec
global $toto ;
qui rendrait $toto global au programme *entièrement* serait bien plus naturel (et donc par extension bien plus perlien) à utiliser.
C'est tout ;-)
PK
Je n'aime pas trop l'idée pour des raisons de portabilité, ce "global" serait vraiment un truc pour faire sa petite cuisine dans son coin, parce que tu ne laisse aucun contrôle à l'utilisateur final, s'il n'est pas toi, sur ce qu'il veut importer... Et ce peut être génant, cf conflit entre les noms de variable. Néanmoins, si tu veux faire un module de variable uniquement et que tu n'as pas peur des conflits (vu que tu es le seul à l'utiliser et que tu es sûr de ne pas te tromper...), tu peux faire un bidouillage comme ça je pense :
package Locvars; require Exporter;
our @ISA = qw(Exporter); #liste des variables à exporter dans l'espace "main" our @EXPORT;
our ($MaVar1, @MaVar2) = ("Hello World !", "Vive", "Perl !n");
sub magic_list{ my $packname = __PACKAGE__; foreach $name(keys %{"${packname}::"}){ local *sym = ${"${packname}::"}{$name}; push @EXPORT, "$$name" if defined $sym; push @EXPORT, "@$name" if( defined @sym and $name ne "EXPORT" and $name ne "ISA" ); push @EXPORT, "%$name" if defined %sym; } } magic_list; 1;
Ce qui exportera toutes les variables de ton paquetage dans l'espace de nom "main::", tu peux aussi faire ta routine "global" ainsi : (ça marche uniquement pour les scalaires) sub exportons { push @EXPORT, "$$_[0]"; my $nomdevar = $_[0]; $$nomdevar = $_[1]; return $$nomdevar; }
tu peux alors l'employer comme ça : exportons "Hello", "Hello World";
(Tu peux l'étendre pour te permettre d'exporter des tableaux ou des hashs, ça n'est pas bien dur.) A toi de voir si ça en vaut vraiment la peine, ou si tu veux carrément réécrire le module Exporter de 0, ce qui est peut-être une meilleure idée...
Patrice Karatchentzeff
Jedaï writes:
[...]
tu peux alors l'employer comme ça : exportons "Hello", "Hello World";
(Tu peux l'étendre pour te permettre d'exporter des tableaux ou des hashs, ça n'est pas bien dur.) A toi de voir si ça en vaut vraiment la peine, ou si tu veux carrément réécrire le module Exporter de 0, ce qui est peut-être une meilleure idée...
Tu me coupes l'herbe sous le pied... Je voulais faire un truc comme cela ;-)
tu peux alors l'employer comme ça :
exportons "Hello", "Hello World";
(Tu peux l'étendre pour te permettre d'exporter des tableaux ou des
hashs, ça n'est pas bien dur.) A toi de voir si ça en vaut vraiment
la peine, ou si tu veux carrément réécrire le module Exporter de 0,
ce qui est peut-être une meilleure idée...
Tu me coupes l'herbe sous le pied... Je voulais faire un truc comme
cela ;-)
tu peux alors l'employer comme ça : exportons "Hello", "Hello World";
(Tu peux l'étendre pour te permettre d'exporter des tableaux ou des hashs, ça n'est pas bien dur.) A toi de voir si ça en vaut vraiment la peine, ou si tu veux carrément réécrire le module Exporter de 0, ce qui est peut-être une meilleure idée...
Tu me coupes l'herbe sous le pied... Je voulais faire un truc comme cela ;-)