我有一个 Perl 哈希,其键以数字开头,或者是数字。
如果我使用,
foreach my $key (sort keys %hash) {
print $hash{$key} . "\n";
}
该列表可能会出现,
0
0001
1000
203
23
代替
0
0001
23
203
1000
我有一个 Perl 哈希,其键以数字开头,或者是数字。
如果我使用,
foreach my $key (sort keys %hash) {
print $hash{$key} . "\n";
}
该列表可能会出现,
0
0001
1000
203
23
代替
0
0001
23
203
1000
foreach my $key (sort { $a <=> $b} keys %hash) {
print $hash{$key} . "\n";
}
排序操作采用一个可选的比较“子例程”(作为代码块,就像我在这里所做的那样,或者作为子例程的名称)。我提供了一个内联比较,它使用内置的数字比较运算符“<=>”将键视为数字。
您的第一个问题是循环体(这里似乎没有其他答案指出)。
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.
$key (sort { $a <=> $b} keys %hash)
会成功的
或降序排序:
$key (sort { $b <=> $a} keys %hash)
甚至
$key (sort { $a <=> $b} values %hash)
$key (sort { $b <=> $a} values %hash)