2010-03-18 10 views
6

Normalmente cuando estoy escribiendo el programa perl. Solía ​​incluir el siguiente paquete.¿Cómo agrupo las importaciones de mi paquete en un único paquete personalizado?

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

Ahora, yo quiero así, no voy a incluir todo este paquete para cada programa. para ese
Tendré todos estos paquetes en mi propio paquete. como siguiendo.

my_packages.pm

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

lo tanto, que si añado my_packages.pm en el programa de Perl, es necesario tener todos los paquetes anteriores.

En realidad, he hecho esta experimentación. Pero no puedo obtener estas cosas. lo que significa que estoy usando my_packages. No puedo obtener la funcionalidad de "use strict, use warnings, use Data :: Dumper".

Alguien me ayude a salir de este problema .....

+0

Ver también http://stackoverflow.com/questions/1678263/ho w-can-i-extend-mooses-automatic-pragma-exports, que analiza lo mismo pero con respecto a los módulos de Moose. – Ether

Respuesta

5

Eche un vistazo a ToolSet, que hace todo el trabajo de importación sucio para usted.

Ejemplo de uso de la vaina:

Creación de un conjunto de herramientas:

# 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 

El uso de un conjunto de herramientas:

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

ver esto:

package Foo; 

use warnings; 

sub import { 
    warnings->import; 
} 

1; 

Y ahora:

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

Tomado de Modern::Perl.

3

Esto es más difícil de lo que esperaba.

  • Para pragmas como strict y warnings se pueden pasar a través.

  • Para los módulos que no exportan funciones como las orientadas a objetos, funcionará.

  • Sin embargo, para los módulos que se exportan por defecto, como Data :: Dumper (le da la función Dumper() en el paquete de la persona que llama), es más complicado.

Puede hacer que funcione contando Exporter que hay una capa extra de magia:

por lo que podría hacer:

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; 

Durante tres módulos, esto apenas parece que vale la pena eso.

Cuestiones relacionadas