use List::MoreUtils 'uniq';
print join ", ", sort uniq ("b", "a", "a");
Run Code Online (Sandbox Code Playgroud)
导致参数“ a”在排序时不是数字...
print join ", ", uniq sort ("b", "a", "a");
Run Code Online (Sandbox Code Playgroud)
可以正常工作。
print join ", ", sort {$a cmp $b} uniq ("b", "a", "a");
Run Code Online (Sandbox Code Playgroud)
也可以工作-但是第一个示例有什么问题?
该代码属于的排序调用
排序SUBNAME LIST
...
如果指定了SUBNAME,它将给出一个子例程的名称,该子例程将返回一个小于,等于或大于0的整数,具体取决于列表元素的排序方式。
将uniq其作为一个裸词,用于指定要用于排序的子项的名称,并且qw(b a a)是要排序的列表-并不是uniq说(可以这么说)对列表进行排序,而是将uniq其用作该列表的排序功能。
出现此错误消息是因为排序功能需要返回一个数字并uniq返回字符串。
您已经找到一种使其工作的方法,并且还可以使用一元 +
say for sort +uniq(@ary); # or: say for sort + uniq @ary;
Run Code Online (Sandbox Code Playgroud)
其中+表示后面的内容表示为表达式,并sort获取评估列表。
或通过使用parens
say for sort (uniq(@ary));
Run Code Online (Sandbox Code Playgroud)
这里内部对也是必要的,因为与sort (uniq @ary)该uniq被解释为在该列表中一个裸词,由此出来的地方。请注意,这是sort (uniq (@ary))行不通的,因为多余的括号无关紧要,而我们又有了一个空词。所以这里的空间很重要。
这种棘手性是由于其sort灵活的(含糊的)接口,可以LIST 选择在其后加上一个裸字,该裸字必须是子名称。最终依赖于解释器来解决其中的一些问题,然后我们必须保持精确。