我认为这是一个简单的问题,但我没有看到其他任何问题:
当您在调试器中时,只需打印变量,就可以看到arrayref或hashref的类型以及十六进制“数字地址”:
DB<1> $x = [ qw(1 2 3) ]
DB<2> p $x
ARRAY(0x1c11ef0)
我可以使用ref($ x)获得类的部分,但是我怎样才能可靠地获取数字地址,即使我有一个其类使用字符串化的hashref?
背景:我问,因为我有自定义“stringify”的类,这个十六进制地址可以帮助我调试重复副本和这些问题,这就是我关心的事情,所以我' d喜欢在字符串化输出中包含此数字地址。
研究:我查看了perldoc perlref,它只讨论了如何获得ref()部分,而不是数字地址部分。
答案 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