¿Cómo hacer “usar My :: defaults” con los valores predeterminados modernos de perl & utf8?

Quiero hacer un módulo para mi propio “uso predeterminado”, por ejemplo:

use My::perldefs; 

con el siguiente contenido (basado principalmente en la publicación de Tchrist ).

 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, quiero lograr un use My::perldefs para lograr

  • soporte utf8 completo y correcto, y con
  • todas las características modernas de perl activadas.

Basado en una pregunta reciente, el buen punto de partida es uni :: perl. Es hacer casi todo lo que quiero, solo necesito agregar:

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

Voy a premiar con la recompensa a alguien que extienda el uni :: perl (inserto abajo) con las 5 líneas anteriores, usando una forma efectiva y correcta.

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


Bellow es 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( "$@" ); $package->load( $caller ); } } } 1; 

PD:

 All of the above is (C): Mons Anderson, C<<  >> 

use feature qw(unicode_strings) es fácil, $^H{feature_unicode} simplemente necesita establecerse. 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 de export través de Exporter que toma el paquete de llamada como parámetro). El autodie es autodie , realmente va estrictamente por el valor de la caller y normalmente inyectará sus funciones en el paquete My::perldefs . Creo que la única buena solución aquí (a menos de My::perldefs el módulo en My::perldefs ) es usar goto : esto permite llamar al método requerido sin cambiar la caller , por lo que los métodos se inyectan en el espacio de nombres correcto. Esto es lo que obtuve 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( "$@" ); $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;