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");
也可以工作-但是第一个示例有什么问题?
答案 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
可选地开头,并带有一个裸字,该裸字必须是子名称。最终依赖于解释器来解决其中的一些问题,然后我们必须保持精确。