“ uniq”后的“ sort”中出现“ is not numeric”错误

时间:2019-08-10 18:13:39

标签: perl sorting uniq

use List::MoreUtils 'uniq';
print join ", ", sort uniq ("b", "a", "a");

结果参数“ a”不是在...处的数字排序

print join ", ", uniq sort ("b", "a", "a");

按预期工作。

print join ", ", sort {$a cmp $b} uniq ("b", "a", "a");

也可以工作-但是第一个示例有什么问题?

1 个答案:

答案 0 :(得分:7)

该代码属于sort调用

  

对SUBNAME列表进行排序

     

...
   如果指定了SUBNAME,它将给出一个子例程的名称,该子例程将返回一个小于,等于或大于0的整数,具体取决于列表元素的排序方式。

uniq被用作裸字,它指定要用于排序的子项的名称,而qw(b a a)是要排序的列表-您不是uniq-列表(可以这么说),但是使用uniq作为该列表的排序功能。

出现错误消息是因为排序功能需要返回数字,而uniq返回字符串。

您已经发现一种使其工作的方法,并且还可以使用一元+

say for sort +uniq(@ary);    # or: say for sort + uniq @ary;

其中+表示随后的内容表示为表达式,而sort则得到评估列表。

或者通过和使用通行证

say for sort (uniq(@ary));

这里也需要内部对,因为对于sort (uniq @ary)uniq在该列表中被解释为一个裸字,因此不合适。请注意,sort (uniq (@ary))不起作用,因为多余的括号无关紧要,而我们又有了一个空词。所以这里的空间很重要。

这种棘手性是由于sort灵活(模糊)的界面所致,它以LIST 可选地开头,并带有一个裸字,该裸字必须是子名称。最终依赖于解释器来解决其中的一些问题,然后我们必须保持精确。