perl – 为什么与uniq排序不能一起工作

前端之家收集整理的这篇文章主要介绍了perl – 为什么与uniq排序不能一起工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下脚本:
  1. use strict;
  2. use List::MoreUtils qw/uniq/;
  3. use Data::Dumper;
  4.  
  5. my @x = (3,2);
  6. my @y = (4,3);
  7.  
  8. print "unique results \n";
  9. print Dumper([uniq(@x,@y)]);
  10.  
  11. print "sorted unique results\n";
  12. print Dumper([sort uniq(@x,@y)]);

输出

  1. unique results
  2. $VAR1 = [
  3. 3,2,4
  4. ];
  5. sorted unique results
  6. $VAR1 = [
  7. 2,3,4
  8. ];

因此看起来排序不适用于uniq.
我不明白为什么.

我用-MO = Deparse运行了perl脚本并得到了

  1. use List::MoreUtils ('uniq');
  2. use Data::Dumper;
  3. use strict 'refs';
  4. my(@x) = (3,2);
  5. my(@y) = (4,3);
  6. print "unique results \n";
  7. print Dumper([uniq(@x,@y)]);
  8. print "sorted unique results\n";
  9. print Dumper([(sort uniq @x,@y)]);

我的解释是perl决定从uniq(@ x,@ y)中删除括号,并使用uniq作为sort的函数.

为什么perl决定这样做?

我怎样才能避免这些和类似的陷阱?

谢谢,
大卫

解决方法

sort builtin接受子程序名称或块作为第一个参数,传递两个项目.然后必须返回一个确定项目之间顺序的数字.这些片段都是这样做的:
  1. use feature 'say';
  2. my @letters = qw/a c a d b/;
  3.  
  4. say "== 1 ==";
  5. say for sort @letters;
  6.  
  7. say "== 2 ==";
  8. say for sort { $a cmp $b } @letters;
  9.  
  10. say "== 3 ==";
  11. sub func1 { $a cmp $b }
  12. say for sort func1 @letters;
  13.  
  14. say "== 4 ==";
  15. sub func2 ($$) { $_[0] cmp $_[1] } # special case for $$prototype
  16. say for sort func2 @letters;

请注意,函数名和列表之间没有任何逗号,请注意Perl中的parens主要用于确定优先级 – sort func1 @letters和sort func1(@letters)是相同的,并且都不执行func1( @letters).

要消除歧义,请在函数名称前放置一个:

  1. sort +uniq @letters;

为了避免这种意外行为,最好的解决方案是在您不确定某个内置行为的行为时阅读文档 – 遗憾的是,许多人都有一些特殊的解析规则.

猜你在找的Perl相关文章