You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:14:59