17

我有一个 Perl 哈希,其键以数字开头,或者是数字。

如果我使用,

foreach my $key (sort keys %hash) {
    print $hash{$key} . "\n";
}

该列表可能会出现,

0
0001
1000
203
23

代替

0
0001
23
203
1000
4

4 回答 4

42
foreach my $key (sort { $a <=> $b} keys %hash) {
    print $hash{$key} . "\n";
}

排序操作采用一个可选的比较“子例程”(作为代码块,就像我在这里所做的那样,或者作为子例程的名称)。我提供了一个内联比较,它使用内置的数字比较运算符“<=>”将键视为数字。

于 2008-12-20T17:56:49.617 回答
19

保罗的答案对数字是正确的,但如果你想更进一步,像人类那样对混合的单词和数字进行排序,cmp也不<=>会这样做。例如,

  9x
  14
  foo
  fooa
  foolio
  Foolio
  foo12
  foo12a
  Foo12a
  foo12z
  foo13a

Sort::自然会处理这个问题,提供nsortncmp例程。

于 2008-12-22T03:14:02.003 回答
2

您的第一个问题是循环体(这里似乎没有其他答案指出)。

foreach my $key ( sort keys %hash ) {
    print $hash{$key} . "\n";
}

我们不知道键%hash是什么。我们只知道$key在循环内按词汇顺序传递给您的它们。然后,您使用密钥访问散列的内容,打印每个条目。

散列的不会按排序顺序出现,因为您对进行排序。

您是否想要按排序顺序输出,请考虑以下循环:

foreach my $value ( sort values(%hash) ) {
    printf( "%s\n", $value );
}

此循环确实按照您观察到的顺序打印值:

0
0001
1000
203
23

要对它们进行数字排序,请使用

foreach my $value ( sort { $a <=> $b } values(%hash) ) {
    printf( "%s\n", $value );
}

这产生

0
0001
23
203
1000

这就是你想要的。

See the Perl manual for the sort function for further information and many more examples.

于 2016-06-22T17:55:45.153 回答
1
$key (sort { $a <=> $b} keys %hash) 

会成功的

或降序排序:

$key (sort { $b <=> $a} keys %hash)

甚至

$key (sort { $a <=> $b} values %hash)
$key (sort { $b <=> $a} values %hash)
于 2016-06-22T17:32:13.683 回答