web-dev-qa-db-fra.com

Comment inclure des fonctions d'un autre fichier dans mon script Perl?

Cela semble être une question vraiment simple, mais mon Google-Fu m'a échoué.

Quelle est la syntaxe pour inclure des fonctions d'autres fichiers dans Perl? Je cherche quelque chose comme C's #include "blah.h"

J'ai vu l'option d'utiliser des modules Perl, mais cela semble nécessiter une réécriture non négligeable de mon code actuel.

65
Zain Rizvi

Utilisez un module. Découvrez perldoc perlmod et Exportateur .

Dans le fichier Foo.pm

package Foo;
use strict;
use warnings;
use Exporter;

our @ISA= qw( Exporter );

# these CAN be exported.
our @EXPORT_OK = qw( export_me export_me_too );

# these are exported by default.
our @EXPORT = qw( export_me );

sub export_me {
    # stuff
}

sub export_me_too {
    # stuff
}

1;

Dans votre programme principal:

use strict;
use warnings;

use Foo;  # import default list of items.

export_me( 1 );

Ou pour obtenir les deux fonctions:

use strict;
use warnings;

use Foo qw( export_me export_me_too );  # import listed items

export_me( 1 );
export_me_too( 1 );

Vous pouvez également importer des variables de package, mais la pratique est fortement déconseillée.

66
daotoad

Perl obligatoire fera le travail. Vous devrez vous assurer que tous les fichiers requis renvoient la vérité en ajoutant

1;

à la fin du fichier.

Voici un petit échantillon:

$ cat m1.pl 
use strict;
sub x { warn "aard"; }
1;

$ cat m2.pl 
use strict;
require "m1.pl";
x();

$ Perl m2.pl 
aard at m1.pl line 2.

Mais migrez vers les modules dès que vous le pouvez .

[~ # ~] modifier [~ # ~]

Quelques avantages de la migration du code des scripts vers les modules:

  • Sans packages, tout occupe un seul espace de noms, vous pouvez donc rencontrer une situation où deux fonctions de fichiers distincts veulent le même nom.
  • Un package vous permet d'exposer certaines fonctions, mais de masquer d'autres. Sans package, toutes les fonctions sont visibles.
  • Les fichiers inclus avec require ne sont chargés qu'au moment de l'exécution, tandis que les packages chargés avec use sont soumis à des vérifications antérieures lors de la compilation.
46
martin clayton

Je pense que vous recherchez les mots-clés require ou se .

8
Daniel Plaisted

Également, do 'file.pl'; fonctionnera, mais les modules sont la meilleure solution.

7
glenn jackman

Je sais que la question dit spécifiquement "fonctions", mais je reçois ce poste en haut de la recherche lorsque je cherche "Perl include", et souvent (comme maintenant) je veux inclure des variables (de manière simple, sans avoir à penser sur les modules). Et donc j'espère que c'est OK de poster mon exemple ici (voir aussi: Perl require and variables ; en bref: utilisez require, et assurez-vous que les fichiers "Includeer" et "Includeee" sont à la fois déclarer la variable comme our):

$ Perl --version

This is Perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi ...

$ cat inc.pl
use warnings;
use strict;

our $xxx = "Testing";

1;

$ cat testA.pl 
use warnings;
use strict;

require "inc.pl";
our $xxx;

print "1-$xxx-\n";
print "Done\n";

$ Perl testA.pl 
1-Testing-
Done


$ cat testB.pl 
use warnings;
use strict;

our $xxx;
print "1-$xxx-\n";

$xxx="Z";
print "2-$xxx-\n";

require "inc.pl";

print "3-$xxx-\n";
print "Done\n";

$ Perl testB.pl 
Use of uninitialized value $xxx in concatenation (.) or string at testB.pl line 5.
1--
2-Z-
3-Testing-
Done
5
sdaau

Ce que vous recherchez est "require file.pl", mais ce que vous devriez regarder est "use module".

4
aartist

Vous devriez vraiment regarder dans les modules Perl cependant, pour un hack rapide, vous pouvez toujours exécuter "Perl -P" qui exécute votre script Perl via le pré-processeur C. Cela signifie que vous pouvez faire #include et amis ....

Un simple hack cependant, méfiez-vous ;-)

4
Benj

Les réponses ci-dessus ont toutes ignoré la partie client: comment importer le module.

Voir la réponse acceptée ici: Comment utiliser un module Perl à partir d'un emplacement relatif?

Sans l'astuce dans cette réponse, vous aurez beaucoup de mal à essayer de trouver le chemin du module correctement lorsque vous use $mymodule;

3
kakyo