如何检索具有重载字符串化的对象的数字地址

时间:2015-02-18 03:52:13

标签: perl

我认为这是一个简单的问题,但我没有看到其他任何问题:

当您在调试器中时,只需打印变量,就可以看到arrayref或hashref的类型以及十六进制“数字地址”:

    DB<1> $x = [ qw(1 2 3) ]
    DB<2> p $x
    ARRAY(0x1c11ef0)

我可以使用ref($ x)获得类的部分,但是我怎样才能可靠地获取数字地址,即使我有一个其类使用字符串化的hashref?

背景:我问,因为我有自定义“stringify”的类,这个十六进制地址可以帮助我调试重复副本和这些问题,这就是我关心的事情,所以我' d喜欢在字符串化输出中包含此数字地址。

研究:我查看了perldoc perlref,它只讨论了如何获得ref()部分,而不是数字地址部分。

2 个答案:

答案 0 :(得分:3)

您可能希望使用Scalar::Util,其中refaddr()将内存地址作为整数返回,

use Scalar::Util 'refaddr';

use CGI;
print "$_\n" for map refaddr($_), ([], {}, \1, CGI->new);

输出

158548440
158551464
158619528
158551512

答案 1 :(得分:0)

可以使用no overloading编译指示在词法范围内禁用重载运算符:

use strict;
use warnings;
use DateTime;

my $now = DateTime->now;
{
   no overloading;
   printf "refaddr: %d  scalar: %s\n", ~~$_, $_ for [],{},\0,$now;
}
print $now,"\n";

输出:

refaddr: 22987080  scalar: ARRAY(0x15ec148)
refaddr: 30100856  scalar: HASH(0x1cb4d78)
refaddr: 23314768  scalar: SCALAR(0x163c150)
refaddr: 30100688  scalar: DateTime=HASH(0x1cb4cd0)
2015-02-23T17:33:44