Scalar::Util::blessed()返回字节串而非Perl字符串问题求助
Scalar::Util::blessed() 返回字节串而非Perl字符串的跨版本/跨平台验证求助
当类名包含非ASCII字符时,将对象传入Scalar::Util::blessed()函数,该函数返回的是字节串而非Perl字符串。我当前在Windows系统使用ActiveState Perl v5.20.2版本,现求助验证该问题是否会在其他平台或Perl版本中出现(备注:confess()函数在调用check_self()时能正确显示类名)。
测试代码
use strict; use warnings; use utf8; use English; use feature qw(unicode_strings); use open qw(:std :utf8); package MyClass { use strict; use warnings; use utf8; use feature qw(unicode_strings); use Carp (); use Scalar::Util (); sub new { my $class = $_[0]; return bless( {}, $class ); } sub check_class { my $class = $_[0]; STDERR->print( "$class\n" ); unless ( defined($class) && ref($class) eq '' && $class->isa(__PACKAGE__) ) { Carp::confess( sprintf( "bad call to %s()", ( caller(1) )[3] ) ); } return; } sub check_self { my $self = $_[0]; check_class( Scalar::Util::blessed($self) ); return; } } package MüClass { use strict; use warnings; use utf8; use Carp (); use Scalar::Util (); sub new { my $class = $_[0]; return bless( {}, $class ); } sub check_class { my $class = $_[0]; STDERR->print( "$class\n" ); Carp::confess( sprintf( "bad call to %s()", ( caller(1) )[3] ) ) unless defined($class) && ref($class) eq '' && $class->isa(__PACKAGE__); return $class; } sub check_self_1 { my $self = $_[0]; return check_class( ref($self) ); } sub check_self_2 { my $self = $_[0]; my $class; $class = check_class( Scalar::Util::blessed($self) ); return $class; } sub check_self_3 { my $self = $_[0]; my $class = Scalar::Util::blessed($self); utf8::decode($class) unless utf8::is_utf8($class); return check_class($class); } } my $myclass = MyClass->new; MyClass->check_class; $myclass->check_self; my $müclass = MüClass->new; MüClass->check_class; $müclass->check_self_1; eval{ $müclass->check_self_2; }; STDERR->print($EVAL_ERROR) if $EVAL_ERROR; $müclass->check_self_3;
执行输出
MyClass MyClass MüClass MüClass MüClass bad call to MüClass::check_self_2() at D:\Batch/test-blessed.pl line 47. MüClass::check_class("M\x{c3}\x{bc}Class") called at D:\Batch/test-blessed.pl line 59 MüClass::check_self_2(MüClass=HASH(0x256d560)) called at D:\Batch/test-blessed.pl line 76 eval {...} called at D:\Batch/test-blessed.pl line 76 MüClass
内容的提问来源于stack exchange,提问作者user1462402
相关产品推荐
相关产品推荐

