Ответ 1
use feature qw(unicode_strings)
легко, $^H{feature_unicode}
просто нужно установить. Другие модули тоже не слишком сложны, просто нужно использовать require
и явно вызвать необходимые функции модуля (например, Encode
и Unicode::Normalize
определить метод export
через Exporter
), который принимает вызывающий пакет как параметр). Трудный autodie
, он действительно строго соответствует значению caller
и обычно вводит его функции в пакет My::perldefs
. Я думаю, что единственное хорошее решение здесь (за исключением переопределения модуля в My::perldefs
) использует goto
- это позволяет вызывать требуемый метод без изменения caller
, поэтому методы вводятся в правильное пространство имен. Вот что я получил в конце:
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;