如何自然地对哈希键进行排序?
我有一个 Perl 哈希,其键以数字开头或为数字。
如果我使用,
foreach my $key (sort keys %hash) {
print $hash{$key} . "\n";
}
列表可能会显示为,
0
0001
1000
203
23
而不是
0
0001
23
203
1000
I have a Perl hash whose keys start with, or are, numbers.
If I use,
foreach my $key (sort keys %hash) {
print $hash{$key} . "\n";
}
the list might come out as,
0
0001
1000
203
23
Instead of
0
0001
23
203
1000
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
排序操作采用可选的比较“子例程”(或者作为代码块,就像我在这里所做的那样,或者作为子例程的名称)。 我提供了一个内联比较,使用内置数字比较运算符“<=>”将键视为数字。
The sort operation takes an optional comparison "subroutine" (either as a block of code, as I've done here, or the name of a subroutine). I've supplied an in-line comparison that treats the keys as numbers using the built-in numeric comparison operator '<=>'.
Paul 的答案对于数字来说是正确的,但是如果您想更进一步,像人类一样对混合单词和数字进行排序,那么
cmp
和<=>
都不会。 例如,Sort::Naturally 可以解决这个问题,提供
nsort
和ncmp
例程。Paul's answer is correct for numbers, but if you want to take it a step further and sort mixed words and numbers like a human would, neither
cmp
nor<=>
will do. For example,Sort::Naturally takes care of this problem, providing the
nsort
andncmp
routines.您的第一个问题是循环体(这里似乎没有其他答案指出)。
我们不知道
%hash
的键是什么。 我们只知道它们在循环内以$key
的形式按照词汇顺序传递给您。 然后,您可以使用密钥访问哈希的内容,并打印每个条目。散列的值不会按排序顺序出现,因为您是按键排序的。
您是否想按排序顺序输出值,请考虑以下循环:
此循环确实按照您观察到的顺序打印值:
要按数字对它们进行排序,请使用
这会产生
您想要的结果。
有关详细信息,请参阅
sort
函数的 Perl 手册还有更多的例子。Your first problem is the body of the loop (which no other answer here seems to point out).
We don't know what the keys of
%hash
are. We just know that they that are handed to you as$key
, in lexical order, inside the loop. You then use the keys to access the contents of the hash, printing each entry.The values of the hash do not come out in a sorted order, because you sort on the keys.
Would you instead want to output the values in sorted order, consider the following loop:
This loop does print the values in the order you observe:
To sort them numerically instead, use
This produces
which is what you wanted.
See the Perl manual for the
sort
function for further information and many more examples.就可以了
或者降序排序:
或者甚至
will do the trick
Or descending sort:
Or even