Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Debutant] Inclure un script dans un autre script

27 réponses
Avatar
Vincent Hiribarren
Bonjour à tous,

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.

Merci d'avance pour vos réponses.

10 réponses

1 2 3
Avatar
jeanpierre.vidal
Vincent Hiribarren wrote in message news:...
Patrice Karatchentzeff writes:

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

$var = 0;

print "avant principal: $varn";
$var++;
print "après principal, avant secondaire : $varn";

&plusdix;
print "après &plusdix : $varn";
---- principal.pl ----

---- secondaire ----
use warnings;
use strict;

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


Avatar
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)
Avatar
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 tout ;-)

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       

Avatar
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://alpage.org/static_html/Les_espaces_de_nom.html
c'est instructif, sur le _pourquoi_ et sur le _comment_

--
dominix



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


bon{,ne} [nuit|jour]
--
dominix



Avatar
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

Avatar
dominix
Jean-Pierre Vidal wrote:
"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


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

export $variable

Tiens, je vais fouiller cela.

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       


Avatar
Jedaï
Patrice Karatchentzeff wrote:
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 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...


Avatar
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 ;-)

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       

1 2 3