以下是代码,实际上,@ arr0和@ arr1不相等,即使在排序后,它们也不相等,但为什么" eq"会打印吗?起初,我考虑过sort funtion的返回值,但它确实返回了一个数组,那么原因是什么?
my @arr0 = (1,2);
my @arr1 = ("a","b");
if ( (sort @arr0) ~~ (sort @arr1) ) {
print "eq\n";
};
答案 0 :(得分:2)
[注意:此答案中文档的所有链接均针对5.12.1版的文档。这确保了答案对原始海报有用 - 它可能会降低对其他人的用处。]
重要的是要意识到数组和列表并不相同。这是行为不同的一种情况。
阅读documentation for sort()
也很重要,首先要说:
在列表上下文中,这会对LIST进行排序并返回已排序的列表值。在标量上下文中,sort()的行为是未定义的。
那里有两件重要的事情。首先,在列表上下文中,sort()
返回一个列表,而不是一个数组。其次,在标量上下文中,它的行为是不确定的。
现在让我们看一下smartmatch documentation。这是左右操作数的一个大表,我不会在这里重现。但请注意,它根本没有提到列表。因此,几乎可以肯定,smartmatch在标量上下文中调用sort()
并进行字符串或数字比较
结果(表格中最后几行之一)。
但是我们知道sort()
在标量上下文中的行为是未定义的。那么谁知道smartmatch正在比较的价值。但我想无论它返回什么随机值,它(至少)都为你的两个列表返回相同的随机值。这意味着它们似乎是平等的。
正如您在评论中所说,当您将排序结果保存在数组中并将数组传递给smartmatch时,它会起作用。那是因为数组在smartmatch表中定义了特殊的行为。
sort()
更新:正如ThisSuitIsNotBlack在评论中提到的那样,自从它在Perl 5.10中引入以来,smartmatch一直相当不稳定。从那以后,它的行为几乎在每个Perl版本中进行了调整,其最终形式仍未完全同意。出于这个原因,我强烈反对你完全不使用它。