如何处理基于标量的Perl类上的属性?

如何处理基于标量的Perl类上的属性?,perl,class,scalar,Perl,Class,Scalar,在Perl中,很容易使用hashref来存储和读取属性: package MyPackage; use strict; use warnings; sub new { bless {}, __PACKAGE__; } sub SomeProperty { my $self = shift; if (@_) { return $self->{SomeProperty} = shift; } $self->{SomeProper

在Perl中,很容易使用
hashref
来存储和读取属性:

package MyPackage;
use strict;
use warnings;

sub new {
    bless {}, __PACKAGE__;
}

sub SomeProperty {
    my $self = shift;
    if (@_) {
        return $self->{SomeProperty} = shift;
    }
    $self->{SomeProperty};
}

# Or even like this to be able to call $obj->OtherProperty = $x;

sub OtherProperty : lvalue {
    my $self = shift;
    $self->{OtherProperty};
}
但是,我见过一些类(来自不同的Perl模块),它们在转储时显示一个简单的标量:

$obj = bless( \$8756489, 'Some::Package' );
然而,它们有方法和属性。我理解的方法是,当询问一个受祝福的
$object->name
时,包
可以调用的任何子例程都将被调用。我不理解的部分是它们如何存储属性。这些财产存放在哪里

有几次,它们接受诸如
$obj->property=$x
$obj->property($x)
之类的内容,并且可以独立于同一类的其他实例。这些财产存放在哪里

我知道这实际上取决于类的底层实现、它正在做什么或它正在与什么交互,这实际上可以多次回答这个问题(例如,对象只是与另一个对象或某个连接交互,并且只向它发送或查询值)

但是,如果有一种方法可以让基于标量的对象存储属性(比如Perl中的类结构的不同概念或方法),我真的很想知道

提前感谢您的评论!:-)

嗯,一种方法是使用。另一种方法是使用基于XS的类,其中标量存储存储属性所在的C/C++结构的地址(通常仅当类的目的是与C/C++库接口时才执行此操作)


你也可以用
substr
pack
做一些奇怪的事情,比如索引标量的部分,但我怀疑除了证明这是可以做到的以外,是否有人做过这件事。

你能举一个这样的模块的例子吗?我真的不知道,每次看到它,我都会越来越好奇,这实际上只是我尝试转储对象以查看某些值的时候。我现在想到的一个例子是GD。创建一个
新的GD::Image
,然后将其转储。GD::Image将是一个基于XS的类的示例,因为它是到的Perl绑定。