Come si scrive un modulo per Perl? In Python è possibile utilizzare:Come si crea un modulo Perl?
# module.py
def helloworld(name):
print "Hello, %s" % name
# main.py
import module
module.helloworld("Jim")
Come si scrive un modulo per Perl? In Python è possibile utilizzare:Come si crea un modulo Perl?
# module.py
def helloworld(name):
print "Hello, %s" % name
# main.py
import module
module.helloworld("Jim")
Una classe:
# lib/Class.pm
package Class;
use Moose;
# define the class
1;
Un modulo che esporta funzioni:
# lib/A/Module.pm
package A::Module;
use strict;
use warnings;
use Sub::Exporter -setup => {
exports => [ qw/foo bar/ ],
};
sub foo { ... }
sub bar { ... }
1;
uno script che utilizza questi:
# bin/script.pl
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin qw($Bin);
use lib "$Bin/../lib";
use Class;
use A::Module qw(foo bar);
print Class->new;
print foo(), bar();
Fondamentalmente si crea un file denominato Yourmodulename.pm
, il cui contenuto sono:
package Yourmodulename;
# Here are your definitions
1; # Important, every module should return a true value
Poi il programma che utilizza il modulo sarà simile:
#!/usr/bin/perl
use strict; # These are good pragmas
use warnings;
# Used modules
use Carp; # A module that you'll probably find useful
use Yourmodulename; # Your module
Si consiglia di organizzare i moduli in modo gerarchico (e, si spera logico). Per fare in modo da creare un albero di directory come:
vostro/Module.pm
vostro/Altro/Module.pm
E poi nel programma:
use Your::Module;
use Your::Other::Module;
Non ci sono più strutture per esportare funzioni e variabili dal tuo modulo, puoi dare un'occhiata a Henning Koch's "Writing serious Perl: The absolute minimum you need to know".
Grazie brian :) – tunnuz
Un "esatta" equivalente del vostro esempio di Python in Perl sarebbe simile a questa:
# MyModule.pm
package MyModule;
sub helloworld {
my ($name) = @_;
print "Hello, $name\n";
}
1;
# main.pl
use MyModule;
MyModule::helloworld('Jim');
Per di più, consultare la documentazione the entry for package
in perlfunc. Per molto altro, consultare la documentazione perlmod.
Un piccolo dettaglio che le risposte finora non hanno menzionato è che, se si dispone di un modulo (preferibilmente piccolo) che è sufficientemente specifico per essere riutilizzato, è possibile inserirlo nello stesso file di il programma principale o un altro pacchetto:
# main.pl
# Since this is a beginner question, I'll also point out that you should
# *always* use strict and warnings. It will save you many headaches.
use strict;
use warnings;
MyModule::helloworld('Jim');
AnotherModule::helloworld('Jim');
package MyModule; # Still in main.pl!
sub helloworld {
my ($name) = @_;
print "Hello, $name\n";
}
package AnotherModule; # Yep, still main.pl
sub helloworld {
my $name = shift;
print "Another hello to $name\n";
}
Questo non viene utilizzato spesso perché ti dà un pacchetto che è definito in un file il cui nome non è la stessa come il pacchetto, che può diventare confuso perché si deve use
/require
il nome del file, ma fare riferimento in codice con il nome del pacchetto.
Si noti inoltre che lo 1;
è necessario solo come riga finale di ogni file incluso tramite use
/require
. In questo caso, non ne ho avuto bisogno perché è in main.pl
. Se si inseriscono più pacchetti nello stesso file, è necessario solo uno 1;
alla fine del file, non dopo ogni pacchetto.
L'ultimo terzo di Intermediate Perl è dedicato alla creazione del modulo.
Ogni volta che si desidera sapere come fare qualcosa in Perl, controllare perltoc, l'indice per la documentazione Perl:
% perldoc perltoc
varie parti del nucleo di documentazione Perl può aiutare a:
Buona fortuna,
Il modo più tradizionale di creazione di un modulo è la seguente:
package Foo::Bar;
our @ISA = qw(Exporter); # Tells perl what to do with...
our @EXPORT = qw(sub1 sub2 sub3); # automatically exported subs
our @EXPORT_OK = qw(sub4 sub5); # exported only when demanded
# code for subs, constants, package variables here
1; # Doesn't actually have to be 1, just a 'true' value.
e come o il rs hanno detto, è possibile utilizzarlo in questo modo:
use Foo::Bar;
h2xs -XA -n :: Modulo
h2xs è un programma di utilità che viene fornito di serie con perl, destinato per l'assistenza nella costruzione di moduli collegati tra header/codice C collegato, ma che può essere usato per costruire uno scheletro completo di un modulo perl puro (con i flag -XA), incluse cose come una directory di test, un file README, un Makefile e un Manifest. (un buon articolo che descrive i dettagli qui: http://perltraining.com.au/tips/2005-09-26.html)
È un po 'vecchio stile, ma vale la pena guardare anche se solo per tutti i promemoria che ti danno per ottenere tutto giusto (test, documentazione, numeri di versione, esportazione e export_ok liste, tutte le cose facili da dimenticare ...)
Finirai con un file "Module.pm" all'interno di una directory "My" (da "My :: Module") che sembra in questo modo:
package My::Module;
use 5.008008;
use strict;
use warnings;
require Exporter;
our @ISA = qw(Exporter);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
# This allows declaration use My::Module ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ('all' => [ qw(
) ]);
our @EXPORT_OK = (@{ $EXPORT_TAGS{'all'} });
our @EXPORT = qw(
);
our $VERSION = '0.01';
# Preloaded methods go here.
1;
__END__
# Below is stub documentation for your module. You'd better edit it!
=head1 NAME
My::Module - Perl extension for blah blah blah
cpanm Module::Starter::PBP
perl -MModule::Starter::PBP=setup
module-starter --module=My::Module
Esattamente quello che stavo cercando, grazie mille :) – Thanos
Interessante ... in tutti i moduli che ho visto, il modo di fare di esportazione è stata ingegno h "il nostro @ISA qw (esportatore); il nostro @EXPORT = qw (funcx funcy funcz) ", anche in PBP. –
Exporter è incorporato, ma fa schifo S :: Ex è molto ... più sexy :) – jrockway
Vero. Ma poi devi distribuire Sub: : Esportatore con il tuo modulo. Le dipendenze fanno schifo! (Ma immagino, se stai usando Moose, hai già imboccato quella strada!) –