加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl:hash-keys丢失了他们的类信息

发布时间:2020-12-15 23:26:28 所属栏目:大数据 来源:网络整理
导读:我有一个包X.pm与方法data_x(); 比方说,我使用类X的实例作为哈希%的键. 现在看到的钥匙%的元素似乎忘记了他们的祝福: use X;my( $x,$y,%seen );$x = X-new();$x-data_x( 1 );print " x: ",$x,"n";print " x.data: ",$x-data_x(),"n";$seen{ $x } = 1;$y
我有一个包X.pm与方法data_x();
比方说,我使用类X的实例作为哈希%的键.
现在看到的钥匙%的元素似乎忘记了他们的祝福:

use X;

my( $x,$y,%seen );

$x = X->new();
$x->data_x( 1 );

print " x:      ",$x,"n";
print " x.data: ",$x->data_x(),"n";

$seen{ $x } = 1;
$y = (keys %seen)[0];

print " y:      ","n";
print " y.data: ",$y->data_x(),"n";

这打印:

x:      X=HASH(0x228fd48)
 x.data: 1
 y:      X=HASH(0x228fd48)
Can't locate object method "data_x" via package "X=HASH(0x228fd48)"
(perhaps you forgot to load "X=HASH(0x228fd48)"?) at test.pl line 15.

$x和$y都指向同一个地址,但显然键没有复制类信息.
为什么会这样?

解决方法

他们不仅失去了他们的祝福,他们甚至不再是hashrefs.

您只能在Perl中使用字符串作为哈希键.

所有尚未成为字符串的内容都将被制作成字符串.因此,哈希中的键不再是对象,而是字符串’X = HASH(0x228fd48)'(这是打印时带来的祝福hashref).无法从该字符串返回对象(除非您有另一个将这些键映射到原始对象的哈希).

您需要使用唯一标识符作为哈希键.看来你可以使用当前的字符串版本(基本上是一个内存地址)来至少检查对象的身份(该对象在它活着时似乎没有被移动),但我不确定它会有多稳定是(内部对象的一些实现似乎基于这个想法),它并没有给你对象相等性检查.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读