我看到以下代码的结果,但我不明白 or
知道接下来要做什么sort
例子:
use Data::Dumper;
$animals{'man'}{'name'} = 'paul';
$animals{'man'}{'legs'} = 2;
$animals{'cheeta'}{'name'} = 'mike';
$animals{'cheeta'}{'legs'} = 3;
$animals{'zebra'}{'name'} = 'steve';
$animals{'zebra'}{'legs'} = 4;
$animals{'cat'}{'name'} = '';
$animals{'cat'}{'legs'} = 3;
$animals{'dog'}{'name'} = '';
$animals{'dog'}{'legs'} = 4;
$animals{'rat'}{'name'} = '';
$animals{'rat'}{'legs'} = 5;
@animals = sort {
$animals{$a}{'name'} cmp $animals{$b}{'name'}
or $animals{$a}{'legs'} <=> $animals{$b}{'legs'}
} keys %animals;
print Dumper(\@animals);
最佳答案
sortsub(在 {}
之后的 sort
中的内容)定义了两层排序:首先按名称,然后按腿数。 or
实现两个标准之间的交叉。如果您以不同的方式格式化代码,则更容易查看:
@animals = sort {
$animals{$a}{'name'} cmp $animals{$b}{'name'} or
$animals{$a}{'legs'} <=> $animals{$b}{'legs'}
} keys %animals;
cmp
和 <=>
运算符返回三个值之一(-1、0 或 1),具体取决于左参数是小于、等于还是大于右参数。 ( cmp
进行字符串比较,<=>
进行数字比较。)在 Perl 中,0 为假,而 -1 和 1 为真。如果cmp
返回一个真值,or
立即返回该值,然后 sort
适本地重新排列元素。如果cmp
返回 false,<=>
被评估并返回其结果。在进行多层排序时,通常使用“map-sort-map”技术(又名 Schwartzian Transform):
@animals =
map { $_->[0] }
sort {
$a->[1] cmp $b->[1] ||
$a->[2] <=> $b->[2]
}
map { [$_, $animal{$_}{name}, $animal{$_}{legs}] }
keys %animal;
这不是很清楚,但因为它通常具有更好的性能,所以这是一个常见的习语。当比较的操作数是函数时,这一点尤其重要——这种技术可以防止对每次比较进行不必要的(并且可能是昂贵的)重新计算。例如,如果您按长度对字符串进行排序,则只需计算每个字符串的长度一次。
关于perl - 按字典顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1009369/