2010-03-18 5 views
6

Normalmente quando scrivo il programma perl. Ho usato includere il seguente pacchetto.Come faccio a raggruppare le importazioni dei pacchetti in un unico pacchetto personalizzato?

use strict ; 
use warnings ; 
use Data::Dumper ; 

Ora, voglio così, non includerò tutto questo pacchetto per ogni programma. per quello
Avrò questi tutti i pacchetti nel mio pacchetto. come seguire

my_packages.pm

package my_packages ; 
{ 
use strict ; 
use warnings ; 
use Data::Dumper; 
} 
1; 

Quindi, che se aggiungo my_packages.pm in programma Perl, ha bisogno di avere tutti i pacchetti di cui sopra.

In realtà ho fatto questa sperimentazione. Ma non sono in grado di ottenere queste cose. che significa quando sto usando my_packages. Non sono in grado di ottenere la funzionalità di "use strict, use warnings, use Data :: Dumper".

Qualcuno mi aiuti uscire da questo problema .....

+0

Vedi anche http://stackoverflow.com/questions/1678263/ho w-can-i-extend-mooses-automatic-pragma-exports, che discute la stessa cosa ma riguarda i moduli Moose. – Ether

risposta

5

Dai un'occhiata allo ToolSet, che fa tutto il lavoro sporco di importazione per te.

esempio di utilizzo da pod:

Creazione di un set di strumenti:

# My/Tools.pm 
package My::Tools; 

use base 'ToolSet'; 

ToolSet->use_pragma('strict'); 
ToolSet->use_pragma('warnings'); 
ToolSet->use_pragma(qw/feature say switch/); # perl 5.10 

# define exports from other modules 
ToolSet->export(
'Carp'   => undef,  # get the defaults 
'Scalar::Util' => 'refaddr', # or a specific list 
); 

# define exports from this module 
our @EXPORT = qw(shout); 
sub shout { print uc shift }; 

1; # modules must return true 

Utilizzando un set di strumenti:

use My::Tools; 

# strict is on 
# warnings are on 
# Carp and refaddr are imported 

carp "We can carp!"; 
print refaddr []; 
shout "We can shout, too!"; 

/I3az/

0

vedere questo:

package Foo; 

use warnings; 

sub import { 
    warnings->import; 
} 

1; 

E ora:

$ perl <<CUT 
> use Foo; 
> \$a = 5; # backslash just to keep the $ from being eaten by shell 
> CUT 
Name "main::a" used only once: possible typo at - line 2. 

Tratto da Modern::Perl.

3

Questo è più difficile di quanto previsto.

  • Per pragma come strict e warnings potete passarle.

  • Per i moduli che non esportano funzioni come quelle orientate agli oggetti, funzionerà.

  • Tuttavia, per i moduli che vengono esportati per impostazione predefinita, come Data :: Dumper (fornisce la funzione Dumper() nel pacchetto del chiamante), è più complicato.

È possibile farlo funzionare dicendo Exporter che ci sia un ulteriore livello di magia:

Così si potrebbe fare:

package my_packages; 

use strict; 
use warnings; 
use Data::Dumper; 
use IO::Socket; 


$Exporter::ExportLevel = 1; # Tell Exporter to export to the caller 

sub import { 

    # Enable this in the callers package 

    strict->import;  # pragma in caller 
    warnings->import;  # pragma in caller 
    Data::Dumper->import; # Adds Dumper() to caller 

    # No need for IO::Socket since it's OO. 

    return 1; 
} 

1; 

Per tre moduli, questo difficilmente sembra essere la pena esso.