2011-06-27 15 views
13

Quiero utilizar algunos paquetes y algunos pragmas en todos mis programas, como:¿Cómo "usar" múltiples módulos con un "uso"?

use 5.014; 
use warnings; 
use autodie; 
use My::ModuleA::Something; 
use ModuleB qw(Func1 Func2); 

no quiero repetirme en cada módulo, por lo que busca una manera cómo hacer un solo paquete, por ejemplo, My::Common lo que contendrá los paquetes anteriores y en mis programas hacen única:

use My::Common; 
say Func1("hello"); #say enabled and Func1 imported in the My::Common 

cómo lograr esto?

El preldoc -f use se leyó y perldoc perlmodlib por lo que creo que debo "algo" para hacer esto con Begin además requiere & importación, pero absolutamente no saben cómo.


ACTUALIZACIÓN: ya estoy trataron las cosas básicas.

Con require - mi programa prg.pl.

require 'mymods.pl'; 
$var = "hello"; 
croak "$var\n"; 

mymods.pl contienen

use strict; 
use feature 'say'; 
use Carp qw(carp croak cluck); 
1; 

no funciona. Ha obtenido un error:

$ perl prg.pl 
String found where operator expected at prg.pl line 3, near "croak "$var\n"" 
    (Do you need to predeclare croak?) 
syntax error at prg.pl line 3, near "croak "$var\n"" 
Execution of prg.pl aborted due to compilation errors. 

con "usar mi":

use My; 
$var = "hello"; 
croak "$var\n"; 

mi My.pm

package My; 
use strict; 
use feature 'say'; 
use Carp qw(carp croak cluck); 
1; 

NO FUNCIONA tampoco. Tengo el mismo error.


¿Alguna idea de trabajo?

Respuesta

8

Me quedo con esto:

package My::Common; 
use 5.14.0; 
use strict; 
use warnings; 
use autodie; 
use Carp qw(carp croak cluck); 

sub import { 
    my $caller = caller; 
    feature->import(':5.14'); 
    # feature->import('say'); 
    strict->import; 
    warnings->import; 
    ## autodie->import; # <-- Won't affect the caller side - see my edit. 
    { 
     no strict 'refs'; 
     for my $method (qw/carp croak cluck/) { 
      *{"$caller\::$method"} = __PACKAGE__->can($method); 
     } 
    } 
} 

1; 

Por favor, corríjanme si me equivoco, o hay una mejor manera.


EDITAR:

Lo siento, estaba equivocado en el uso de autodie->import ...

Ésta debería funcionar, pero se supone que siempre llama My::Common del paquete main:

package My::Common; 
# ... 
sub import { 
    # ... 
    strict->import; 
    warnings->import; 
    { 
     package main; 
     autodie->import; 
    } 
    # ... 
} 

Así que, por supuesto, es mucho más seguro y sencillo agregar un use autodie; a cada secuencia de comandos:

use My::Common; 
use autodie; 
# ... 
+0

¡SÍ! Esto funciona. ;) Gracias. Por lo tanto, necesita importar las llamadas, y para las funciones exportadas necesita hacer el VooDoo oscuro :) con * {"$ caller ....}. – kobame

+0

@kobame: Oh, espera, acabo de descubrir que' autodie-> import' didn ' t trabajo como pensé que sería. Por favor, eche un vistazo a mi edición. – yibe

+2

¿Por qué no mencionar el estado de la técnica en CPAN? [Toolkit] (http://p3rl.org/Toolkit), [ToolSet] (http: // p3rl .org/ToolSet), [rig] (http://p3rl.org/rig), [perl5i] (http://p3rl.org/perl5i), [perl5] (http://p3rl.org/perl5) hazlo ya. – daxim

8

En realidad es bastante simple, si reemplaza método import su "común" del módulo.Consulte la fuente del módulo Modern::Perl de chromatic para ver un ejemplo de exportación de pragmas.

para la re-exportación de cosas definidas en otros módulos, me parece recordar que $export_to_level (ver los Exporter documentos, aunque no se explica todo lo que claramente) debería hacer eso, aunque no puedo encontrar buenos ejemplos en este momento . Otra opción sería Pollute::persistent, aunque no lo he usado, no conozco a nadie más que lo haya usado, y no puedo decir qué tan estable/sólido es. Si funciona, sin embargo, es probablemente la opción más rápida y fácil.

3

Acabo de ver un módulo llamado rig en CPAN. Pruébalo.

+0

fyi, está aquí: http://search.cpan.org/~rodrigo/rig-0.03/ – Baggio

+0

buen punto. thanx. – kobame

Cuestiones relacionadas