"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
可选 前面有一个裸词,这需要是子名称。它最终依靠解释器来解决其中的一些问题,然后我们必须做到精确。
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
得到了评估列表。有关一元 +
.
或者一直使用括号
say for sort (uniq(@ary));
这里内部对也是必需的,因为对于 sort (uniq @ary)
,uniq
在该列表中被解释为裸词,因此不合适。请注意,sort (uniq (@ary))
将不起作用,因为额外的括号无关紧要,我们又一次有了裸词;所以 space 在这里很重要!
这种技巧是由于 sort
的灵活(模糊)界面,采用 LIST
可选 前面有一个裸词,这需要是子名称。它最终依靠解释器来解决其中的一些问题,然后我们必须做到精确。