停止perl重载或打印内存"地址"的引用

EMi*_*ler 4 perl operator-overloading memory-address

我有一个我创建的类,它重载""运算符以打印出一个用户可读的对象的良好字符串形式.

但是现在,我想实际获取内存地址,例如:

Some_class=HASH(0xb0aff98)
Run Code Online (Sandbox Code Playgroud)

print "$some_object"如果我还没有覆盖""运算符,这就是我通常使用的方法.

有没有办法绕过重写的方法,或者失败,只需获取此对象的内存地址?

ike*_*ami 6

使用overload::StrVal($o).

use overload '""' => sub { "Hello, World!" };
my $o = bless({});
print($o, "\n");                     # Hello, World!
print(overload::StrVal($o), "\n");   # main=HASH(0x62d038)
Run Code Online (Sandbox Code Playgroud)


Mil*_*ler 5

两种选择:

  1. 使用 overload::StrVal

    公共职能

    程序包overload.pm提供以下公共功能:

    • overload::StrVal(arg)

      arg在没有stringify重载的情况下给出as 的字符串值。如果您使用它来获取引用的地址(用于检查两个引用是否指向同一事物),则最好使用Scalar::Util::refaddr(),它会更快。

  2. 使用 Scalar::Util::refaddr()

    $addr = refaddr( $ref )

    如果$ref为reference,则将引用值的内部存储器地址作为纯整数返回。否则,将返回undef。

       1.    $addr = refaddr "string";           # undef
       2.    $addr = refaddr \$var;              # eg 12345678
       3.    $addr = refaddr [];                 # eg 23456784
       4. 
       5.    $obj  = bless {}, "Foo";
       6.    $addr = refaddr $obj;               # eg 88123488
    
    Run Code Online (Sandbox Code Playgroud)