perl – 为什么与uniq排序不能一起工作
发布时间:2020-12-15 21:15:23 所属栏目:大数据 来源:网络整理
导读:我有以下脚本: use strict;use List::MoreUtils qw/uniq/;use Data::Dumper;my @x = (3,2);my @y = (4,3);print "unique results n";print Dumper([uniq(@x,@y)]);print "sorted unique resultsn";print Dumper([sort uniq(@x,@y)]); 输出是 unique resul
我有以下脚本:
use strict; use List::MoreUtils qw/uniq/; use Data::Dumper; my @x = (3,2); my @y = (4,3); print "unique results n"; print Dumper([uniq(@x,@y)]); print "sorted unique resultsn"; print Dumper([sort uniq(@x,@y)]); 输出是 unique results $VAR1 = [ 3,2,4 ]; sorted unique results $VAR1 = [ 2,3,4 ]; 因此看起来排序不适用于uniq. 我用-MO = Deparse运行了perl脚本并得到了 use List::MoreUtils ('uniq'); use Data::Dumper; use strict 'refs'; my(@x) = (3,2); my(@y) = (4,3); print "unique results n"; print Dumper([uniq(@x,@y)]); print "sorted unique resultsn"; print Dumper([(sort uniq @x,@y)]); 我的解释是perl决定从uniq(@ x,@ y)中删除括号,并使用uniq作为sort的函数. 为什么perl决定这样做? 我怎样才能避免这些和类似的陷阱? 谢谢, 解决方法sort builtin接受子程序名称或块作为第一个参数,传递两个项目.然后必须返回一个确定项目之间顺序的数字.这些片段都是这样做的:
use feature 'say'; my @letters = qw/a c a d b/; say "== 1 =="; say for sort @letters; say "== 2 =="; say for sort { $a cmp $b } @letters; say "== 3 =="; sub func1 { $a cmp $b } say for sort func1 @letters; say "== 4 =="; sub func2 ($$) { $_[0] cmp $_[1] } # special case for $$prototype say for sort func2 @letters; 请注意,函数名和列表之间没有任何逗号,请注意Perl中的parens主要用于确定优先级 – sort func1 @letters和sort func1(@letters)是相同的,并且都不执行func1( @letters). 要消除歧义,请在函数名称前放置一个: sort +uniq @letters; 为了避免这种意外行为,最好的解决方案是在您不确定某个内置行为的行为时阅读文档 – 遗憾的是,许多人都有一些特殊的解析规则. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |