"isn't numeric" "uniq" 之后 "sort" 中的错误

"isn't numeric" error in "sort" after "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");

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

该代码属于 sort

的调用

sort SUBNAME LIST

...
If SUBNAME is specified, it gives the name of a subroutine that returns an integer less than, equal to, or greater than 0 , depending on how the elements of the list are to be ordered.

第一个示例中的 uniq 被视为一个裸词,它指定用于排序的子名称,而 qw(b a a) 是要排序的列表——你不是 uniq-ing 列表(可以这么说)但是正在使用 uniq 作为该列表的排序函数。

出现错误消息是因为排序函数需要 return 一个数字和 uniq return 个字符串。

您发现了一种让它工作的方法,也可以使用一元 +

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

因为后面的 + 被视为 表达式 ,所以 sort 得到了评估列表。有关一元 +.

的此类用法的讨论,请参见 and this post

或者一直使用括号

say for sort (uniq(@ary));

这里内部对也是必需的,因为对于 sort (uniq @ary)uniq 在该列表中被解释为裸词,因此不合适。请注意,sort (uniq (@ary)) 将不起作用,因为额外的括号无关紧要,我们又一次有了裸词;所以 space 在这里很重要!

这种技巧是由于 sort 的灵​​活(模糊)界面,采用 LIST 可选 前面有一个裸词,这需要是子名称。它最终依靠解释器来解决其中的一些问题,然后我们必须做到精确。