perl使用智能匹配比较排序的数组

时间:2017-04-01 06:27:44

标签: arrays perl sorting

以下是代码,实际上,@ arr0和@ arr1不相等,即使在排序后,它们也不相等,但为什么" eq"会打印吗?起初,我考虑过sort funtion的返回值,但它确实返回了一个数组,那么原因是什么?

my @arr0 = (1,2);
my @arr1 = ("a","b");

if ( (sort @arr0) ~~ (sort @arr1) ) {
    print "eq\n";
};

1 个答案:

答案 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版本中进行了调整,其最终形式仍未完全同意。出于这个原因,我强烈反对你完全不使用它。