2011-06-20 4 views
15

Quiero hacer un módulo para mi propio "uso por defecto", por ejemplo: (. Mayormente basado en tchrist's posterior)¿Cómo hacer "usar My :: defaults" con los valores predeterminados modernos de perl & utf8?

use My::perldefs; 

con el siguiente contenido

use 5.014; 
use strict; 
use features qw(switch say state); 

no warnings; 
use warnings qw(FATAL closed threads internal debugging pack substr malloc 
       unopened portable prototype inplace io pipe unpack regexp 
       deprecated exiting glob digit printf utf8 layer 
       reserved parenthesis taint closure semicolon); 
no warnings qw(exec newline); 

use utf8; 
use open qw(:std :utf8); 
use charnames qw(:full); 
use feature qw(unicode_strings); 
use Encode qw(encode decode); 
use Unicode::Normalize qw(NFD NFC); 
use Carp qw(carp croak confess cluck); 
use autodie; 

Simplemente, quiere lograr uno use My::perldefs para lograr

  • apoyo total y correcta UTF-8, y con
  • todas las funciones de Perl modernas están activadas.

Basado en recent question el buen punto de partida es uni :: perl. Es hacer casi todas las cosas lo que quiero, sólo es necesario añadir:

use feature qw(unicode_strings); 
use charnames qw(:full); 
use Encode qw(encode decode); 
use Unicode::Normalize qw(NFD NFC); 
use autodie; 

que premiará con la generosidad alguien que va a extender la uni :: Perl (inseretd a continuación) con las 5 líneas anteriores, el uso de un forma efectiva y correcta.

Por favor, AYUDEN a hacer un buen modelo para utf8 y el uso moderno de Perl. Gracias.


A continuación se muestra la copia de uni :: perl.

package My::perldefs; 

use 5.014; 
BEGIN { 
    ${^WARNING_BITS} ^= ${^WARNING_BITS}^"\xfc\x3f\xf3\x00\x0f\xf3\xcf\xc0\xf3\xfc\x33\x03"; 
    $^H |= 0x00000602; 
} 
m{ 
use strict; 
use warnings; 
}x; 
use mro(); 

BEGIN { 
    for my $sub (qw(carp croak confess)) { 
     no strict 'refs'; 
     *$sub = sub { 
      my $caller = caller; 
      local *__ANON__ = $caller .'::'. $sub; 
      require Carp; 
      *{ $caller.'::'.$sub } = \&{ 'Carp::'.$sub }; 
      goto &{ 'Carp::'.$sub }; 
     }; 
    } 
} 

sub import { 
    my $me = shift; 
    my $caller = caller; 
    ${^WARNING_BITS} ^= ${^WARNING_BITS}^"\xfc\x3f\xf3\x00\x0f\xf3\xcf\xc0\xf3\xfc\x33\x03"; 

    $^H |= 
      0x00000602 # strict 
     | 0x00800000 # utf8 
    ; 

    # use feature 
    $^H{feature_switch} = 
    $^H{feature_say} = 
    $^H{feature_state} = 1; 

    # use mro 'c3'; 
    mro::set_mro($caller, 'c3'); 

    #use open (:utf8 :std); 
    ${^OPEN} = ":utf8\0:utf8"; 
    binmode(STDIN, ":utf8"); 
    binmode(STDOUT, ":utf8"); 
    binmode(STDERR, ":utf8"); 

    for my $sub (qw(carp croak confess)) { 
     no strict 'refs'; 
     *{ $caller .'::'. $sub } = \&$sub; 
    } 
    while (@_) { 
     my $feature = shift; 
     if ($feature =~ s/^://) { 
      my $package = $me. '::'. $feature; 
      eval "require $package; 1" or croak("[email protected]"); 
      $package->load($caller); 
     } 
    } 
} 

1; 

Sal:

All of the above is (C): Mons Anderson, C<< <mons at cpan.org> >> 
+2

relacionadas: [perl5i] (http://p3rl.org/perl5i), [perl5] (http://p3rl.org/perl5), [Toolkit] (http://p3rl.org/Toolkit). – daxim

+2

También [ToolSet] (http://search.cpan.org/perldoc?ToolSet) podría ser de su interés. – bvr

Respuesta

9

use feature qw(unicode_strings) es fácil, $^H{feature_unicode} necesita simplemente a establecer. Los otros módulos tampoco son demasiado difíciles, uno simplemente necesita usar require y llamar explícitamente a las funciones de módulo necesarias (por ejemplo, Encode y Unicode::Normalize definen un método export a través del Exporter que toma el paquete de llamada como parámetro). El truco es autodie, realmente va estrictamente por el valor de caller y normalmente inyectará sus funciones en el paquete My::perldefs. Creo que la única buena solución aquí (salvo la reimplementación del módulo en My::perldefs) es usar goto - esto permite llamar al método requerido sin cambiar caller, por lo que los métodos se inyectan en el espacio de nombres correcto. Esto es lo que tengo al final:

package My::perldefs; 

use 5.014; 
BEGIN { 
    ${^WARNING_BITS} ^= ${^WARNING_BITS}^"\xfc\x3f\xf3\x00\x0f\xf3\xcf\xc0\xf3\xfc\x33\x03"; 
    $^H |= 0x00000602; 
} 
m{ 
use strict; 
use warnings; 
}x; 
use mro(); 

BEGIN { 
    for my $sub (qw(carp croak confess)) { 
     no strict 'refs'; 
     *$sub = sub { 
      my $caller = caller; 
      local *__ANON__ = $caller .'::'. $sub; 
      require Carp; 
      *{ $caller.'::'.$sub } = \&{ 'Carp::'.$sub }; 
      goto &{ 'Carp::'.$sub }; 
     }; 
    } 
} 

sub import { 
    my $me = shift; 
    my $caller = caller; 
    ${^WARNING_BITS} ^= ${^WARNING_BITS}^"\xfc\x3f\xf3\x00\x0f\xf3\xcf\xc0\xf3\xfc\x33\x03"; 

    $^H |= 
      0x00000602 # strict 
     | 0x00800000 # utf8 
    ; 

    # use feature 
    $^H{feature_switch} = 
    $^H{feature_say} = 
    $^H{feature_state} = 
    $^H{feature_unicode}= 1; 

    # use mro 'c3'; 
    mro::set_mro($caller, 'c3'); 

    #use open (:utf8 :std); 
    ${^OPEN} = ":utf8\0:utf8"; 
    binmode(STDIN, ":utf8"); 
    binmode(STDOUT, ":utf8"); 
    binmode(STDERR, ":utf8"); 

    #use charnames qw(:full) 
    require charnames; 
    charnames->import(":full"); 

    #use Encode qw(encode decode) 
    require Encode; 
    Encode->export($caller, "encode", "decode"); 

    #use Unicode::Normalize qw(NFC NFD) 
    require Unicode::Normalize; 
    Unicode::Normalize->export($caller, "NFC", "NFD"); 

    for my $sub (qw(carp croak confess)) { 
     no strict 'refs'; 
     *{ $caller .'::'. $sub } = \&$sub; 
    } 
    while (@_) { 
     my $feature = shift; 
     if ($feature =~ s/^://) { 
      my $package = $me. '::'. $feature; 
      eval "require $package; 1" or croak("[email protected]"); 
      $package->load($caller); 
     } 
    } 

    #use autodie qw(:default) 
    #goto needs to be used here to make sure that caller doesn't change 
    require autodie; 
    @_ = ("autodie", ":default"); 
    goto &autodie::import; 
} 

1; 
+0

Cuando se usa la parte de autodie, $ {^ OPEN} = ": utf8 \ 0: utf8"; - deja de funcionar. Por lo tanto, lo usará sin la parte de autodie. De todos modos, gracias. En otras palabras, "usar autodie" no es compatible con $ {^ OPEN}. – jm666

+0

heh - acabo de encontrar este http://stackoverflow.com/questions/4959384/does-the-autodie-pragma-have-influence-on-the-encoding/4959646#4959646 es un error conocido de Perl. – jm666

Cuestiones relacionadas