perl - 按字典顺序排序

标签 perl sorting cmp lexicographic

我看到以下代码的结果,但我不明白 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/

相关文章:

javascript - 如何比较 Javascript 数组?

Mysql UPDATE 延迟几秒(Perl dbi)

perl - Regexp::Common::URI::http - 它能找到带有破折号的 URL,例如我的网站.domain.com

c - 按名称中包含空格的字母顺序对结构体数组进行排序

assembly - JNZ 和 CMP 组装说明

c++ - 为什么 leetcode c++ sort() 给出编译错误?

perl - "sub END"怎么知道程序已经死了? (Perl)

perl - 理解 perl 使用结构

excel - 绝对值排序范围

c - 在这个冒泡排序代码中,这些变量 c 和 d 在 C 中意味着什么?