ツンデレ実装 の改造をしていて妙な壁にぶち当たってしまった。
use strict;
use warnings;
no strict qw/refs/;
no warnings qw/redefine/;
use utf8;
print "with Encode $Encode::VERSION\n";
print "with utf8 $utf8::VERSION\n";
package あ;
use Encode;
sub new {
my $pkg = shift;
*{$pkg . '::いち'} = sub { print "f1\n"; };
*{$pkg . encode_utf8('::に')} = sub { print "f2\n"; };
my $self = bless [], $pkg;
*{$pkg . '::さん'} = sub { print "f3\n"; };
*{$pkg . encode_utf8('::よん')} = sub { print "f4\n"; };
$self;
}
sub ご {
my $self = shift;
my $pkg = ref $self;
*{$pkg . encode_utf8('::ご')} = sub { print "f5\n"; };
$self->ご;
}
package い;
our @ISA = ('あ');
use Encode;
sub f2 {
my $self = shift;
my $pkg = ref $self;
*{$pkg . '::いち'} = sub { print "F1!\n"; };
*{$pkg . encode_utf8('::に')} = sub { print "F2!\n"; };
*{$pkg . '::ろく1'} = sub { print "F6-1!\n"; };
*{$pkg . encode_utf8('::ろく2')} = sub { print "F6-2!\n"; };
}
sub ご { print "F5!\n"; }
package main;
use Encode;
sub check {
eval { shift->() };
print "-\n" if $@;
}
my $obj = あ->new;
check sub { $obj->いち };
check sub { $obj->に };
check sub { $obj->さん };
check sub { $obj->よん };
check sub { $obj->ご };
- = sub { print "F0-1!\n"; };
- = sub { print "F0-2!\n"; };
$obj = い->new;
$obj->f2;
*{"い::なな1"} = sub { print "F7-1!\n"; };
*{encode_utf8("い::なな2")} = sub { print "F7-2!\n"; };
check sub { $obj->ぜろ1 };
check sub { $obj->ぜろ2 };
check sub { $obj->いち };
check sub { $obj->に };
check sub { $obj->さん };
check sub { $obj->よん };
check sub { $obj->ご };
check sub { $obj->ろく1 };
check sub { $obj->ろく2 };
check sub { $obj->なな1 };
check sub { $obj->なな2 };
を実行すると
> perl test.pl
with Encode 2.31
with utf8 1.07
f1
-
f3
-
f5
F0-1!
F0-2!
f1
F2!
f3
-
F5!
-
F6-2!
F7-1!
F7-2!
という風に、型グロブを通してnon-ASCIIな名前を持つサブルーチンの定義を弄る場合に、encode_utf8 が必要だったり不要だったりどっちでもいけたりとまちまちな結果に。
で、perldoc utf8 したら、ちゃんと BUGSのところに One can have Unicode in identifier names, but not in package/class or subroutine names. (略) use of Unicode for the said purposes is unsupported.
とあった。
そうか、未サポートだったのか。残念 (´・ω・





コメントする