Perl的FreezeThaw中cmpStr和cmpStrHard有什么区别?

时间:2009-08-13 21:16:33

标签: perl

FreezeThawcmpStrcmpStrHard之间的区别是什么?

常见问题解答How do I test whether two arrays or hashes are equal?

中提到了它们

1 个答案:

答案 0 :(得分:6)

文档非常模糊,源代码很难遵循,但FAQ中的示例提供了一些见解。在研究了所有这些之后,我想我了解了这些功能以及文档的含义。

CmpStr比较两个数据结构的序列化表示。如果它们是等价的,则返回0。否则返回非零值。 (从技术上讲,如果第一个数据结构小于第二个数据结构则返回-1,如果它更大则返回+1,但“小于”和“大于”的概念对于哈希特别有用。)

CmpStrHard类似但更严格。仅当两个数据结构完全相同时,它才返回0。

等价和等式之间的区别在于用于构建复杂数据结构的引用。请考虑以下事项:

my ($x, $y, $z);
$x = [1];
$y = [1];
$z = $y;

$x$y是等价的:它们都是对包含单个值“1”的数组的引用。 $y$z不仅仅是等价的,它们是相同的:它们都是对同一个匿名数组的引用。如果你说

$y->[0] = 2;

然后$x$y将不再相同,但$y$z仍然相同。

我相信当FreezeThaw文档说“被视为一个组”时,它说的是可能包含对相同对象的引用的数据结构。 (如果是这样,冻结/解冻循环应该保留这些关系。)