Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何检索具有重载字符串化的对象的数字地址_Perl - Fatal编程技术网

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

Perl 如何检索具有重载字符串化的对象的数字地址,perl,Perl,我认为这是一个简单的问题,但我看不到有人问过这个问题: 在调试器中,只需打印变量即可查看arrayref或hashref的类型以及十六进制“数字地址”: DB<1> $x = [ qw(1 2 3) ] DB<2> p $x ARRAY(0x1c11ef0) DB$x=[qw(13)] DB p$x 阵列(0x1c11ef0) 我可以使用ref($x)获得类部分,但是即使我有一个hashref,它的类使用stringification,我如何可

我认为这是一个简单的问题,但我看不到有人问过这个问题:

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

    DB<1> $x = [ qw(1 2 3) ]
    DB<2> p $x
    ARRAY(0x1c11ef0)
DB$x=[qw(13)]
DB p$x
阵列(0x1c11ef0)
我可以使用ref($x)获得类部分,但是即使我有一个hashref,它的类使用stringification,我如何可靠地只获得数字地址呢

上下文:我问这个问题是因为我有一些类,其中有一个自定义的“stringify”,这个十六进制地址可以帮助我调试重复的副本和类似的问题,我很关心这些问题,所以我想在stringify输出中包含这个数字地址

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

您可能需要使用,其中
refaddr()
以整数形式返回内存地址

use Scalar::Util 'refaddr';

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

158548440
158551464
158619528
158551512

可以使用pragma在词法范围内禁用重载运算符:

输出:

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

如果您将引用视为标量,您将获得地址,例如
perl-e'print[],{},\”
实际上,我认为Ben的建议会起作用,但注意上面的“上下文”,它实际上不适用于字符串化对象。所以我的问题似乎比我想象的要难,因为这个简单的答案不会满足我的要求。同样,我有一个用字符串化定义的类,这意味着当我打印对象时,我得到了我想要的更好看的东西;然而,我真的需要那个数字地址位。我原以为$x+0可以用,但一旦这个东西被“祝福”了,它就不起作用了。不管它是十六进制还是非十六进制,我都不挑剔。毕竟,我可以把它转换。我只希望任何在这一点上起作用的东西都能给我这个数字地址。我有自己的对象实例,属于自己的类/包,它具有字符串化,因此它不再像“MyClass=HASH(0x1c11ef0)”那样发出输出。它发出类似“MyClass具有14个状态”的输出和CGI->new生成了一个受祝福的hashref,但CGI类没有字符串化。@user62177541如果您在类中使用重载,请检查update.Eureka,是的,我相信Scalar::Util refaddr正是我想要的。我已经用实际的代码测试了这些,这是第一个有效的。虽然我没有使用,但上面的hexaddr位。
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