gpt4 book ai didi

perl - 为什么用 uniq 排序不能一起工作

转载 作者:行者123 更新时间:2023-12-04 14:01:17 26 4
gpt4 key购买 nike

我有以下脚本:

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 results\n";
print Dumper([sort uniq(@x,@y)]);

输出是
unique results 
$VAR1 = [
3,
2,
4
];
sorted unique results
$VAR1 = [
2,
3,
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 results\n";
print Dumper([(sort uniq @x, @y)]);

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

为什么 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 中的括号主要用于确定优先级 – sort func1 @letterssort func1 (@letters)是相同的,并且都不执行 func1(@letters) .

要消除歧义,请放置 +在函数名之前:
sort +uniq @letters;

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

关于perl - 为什么用 uniq 排序不能一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20239503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com