Perl的默认对象到字符串转换定义在哪里?

ijnw1ujt  于 2023-05-29  发布在  Perl
关注(0)|答案(3)|浏览(102)

如果我在Perl中打印一个受祝福的对象的引用,我会得到这样的结果:

Foo::Bar=HASH(0x0123456789ab)

代码在哪里定义?第一部分是ref($obj),但HASH十六进制值从何而来?
我尝试为具有可选name属性的对象编写to_string重载运算符。如果提供了name,我希望打印它

Foo::Bar(name=joe)

如果name不是undefined,则返回到默认的Perl字符串。因此,我必须能够从我的代码中调用Perl的转换代码,或者自己编写等效的代码,这就是我的问题。

jfgube3f

jfgube3f1#

我不相信这种格式是有文档记录的,但它不太可能改变。相当于

use Scalar::Util qw( blessed refaddr reftype );

my $pkg = blessed($ref);
my $str = sprintf("%s%s(0x%x)",
   ( defined($pkg) ? "$pkg=" : "" ),
   reftype($ref),
   refaddr($ref),
);

如果你想要Perl对引用的字符串化的组件,你可以使用blessedreftyperefaddr,但是下面是获得Perl对引用的字符串化的最佳方法:

use overload qw( );

my $str = overload::StrVal($ref);
cuxqih21

cuxqih212#

没关系,当然,在我发布这篇文章后的一分钟,我找到了答案:

overload::StrVal($o)

(see也停止perl重载或打印内存“地址”的引用)

vlurs2pr

vlurs2pr3#

一种基于对象的数据(属性)对对象进行字符串化的方法

package ClassStringify;

use warnings;
use strict;

sub new {
    my ($class, %args) = @_; 
    return bless { %args }, $class; 
}

use overload  q("") => sub { 
    my $self = shift; 
    return exists $self->{name} ? $self->stringify() : $self;
};

sub stringify {
    my $self = shift;
    return join "\n", map { "$_ => $self->{$_}" } keys %$self;
}

1;

关于Main

use warnings;
use strict;
use feature 'say';

use ClassStringify;

say ClassStringify->new( name => 'obj_name', id => 123 );
say '---';    
say ClassStringify->new( id => 123 );

什么指纹

name => obj_name
id => 123
---
ClassStringify=HASH(0x23b62c8)

对于所需的打印格式

use overload  q("") => sub { 
    my $self = shift; 
    return exists $self->{name} ? $self->stringify('name') : $self;   
};

sub stringify {
    my ($self, $attr) = @_; 
    return ref($self) . " ($attr=$self->{$attr})";
}

这个打印

ClassStringify (name=obj_name)
---
ClassStringify=HASH(0x22852c8)

相关问题