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

前端之家收集整理的这篇文章主要介绍了Perl:hash-keys丢失了他们的类信息前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个包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).无法从该字符串返回对象(除非您有另一个将这些键映射到原始对象的哈希).

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

猜你在找的Perl相关文章