EMi*_*ler 4 perl operator-overloading memory-address
我有一个我创建的类,它重载""
运算符以打印出一个用户可读的对象的良好字符串形式.
但是现在,我想实际获取内存地址,例如:
Some_class=HASH(0xb0aff98)
Run Code Online (Sandbox Code Playgroud)
print "$some_object"
如果我还没有覆盖""
运算符,这就是我通常使用的方法.
有没有办法绕过重写的方法,或者失败,只需获取此对象的内存地址?
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)
两种选择:
公共职能
程序包
overload.pm
提供以下公共功能:
overload::StrVal(arg)
arg
在没有stringify重载的情况下给出as 的字符串值。如果您使用它来获取引用的地址(用于检查两个引用是否指向同一事物),则最好使用Scalar::Util::refaddr()
,它会更快。
$addr = refaddr( $ref )
如果
$ref
为reference,则将引用值的内部存储器地址作为纯整数返回。否则,将返回undef。Run Code Online (Sandbox Code Playgroud)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