如何在Perl中从哈希表中获取前n个键值对

如何在Perl中从哈希表中获取前n个键值对,perl,hash,Perl,Hash,我对perl非常陌生,所以我搜索了一些时间,但仍然得到了答案。我想从一个哈希表中得到前100对,但不知道怎么做。要从哈希表中获取每一对,我们可以执行以下操作: foreach my $term (keys %hashtable) { do something regarding $hashtable{$term} here } 但如何从中获得前100双呢?非常感谢 我也是Perl新手,可能有更优雅的解决方案,但您可以执行以下操作: my $i = 0; foreach my $term

我对perl非常陌生,所以我搜索了一些时间,但仍然得到了答案。我想从一个哈希表中得到前100对,但不知道怎么做。要从哈希表中获取每一对,我们可以执行以下操作:

foreach my $term (keys %hashtable)
{
    do something regarding $hashtable{$term} here
}

但如何从中获得前100双呢?非常感谢

我也是Perl新手,可能有更优雅的解决方案,但您可以执行以下操作:

my $i = 0;
foreach my $term (keys %hashtable) {
    ...
    do something regarding $hashtable{$term} here
    ...

    last if ($i++) == 100;    
}

请注意,由于散列没有特定的顺序,因此与散列中的前100对完全不同

另一种解决方案可以防止您的“一次关闭”错误:

for my $i (1 .. 100) {
    my ($key, $value) = each %hashtable;
    print "$key => $value\n";
}
另一种方式:

my %hash100 = (%hashtable)[0..199];
while ( my ($key, $value) = each %hash100 ) {
    ...
}
或:


请注意,这得到的是“第一”101对,而不是100对。好的,我更正了一点。。。也许这样行得通。如果需要排序顺序,您可以使用
sort{$a cmp$b}keys%哈希表对键进行排序
谢谢提醒。我想从中得到前100对,因为我首先按值对哈希表进行排序。@lam619您不能按值(或其他任何内容)对哈希表进行排序。散列是无序的,句号。您可以做的是对键进行排序,然后在这个排序的数组上迭代。@Iam619恕我直言,这里似乎有一个典型的XY问题。你有一个分数散列(可能是'player'=>'score')格式,现在你需要打印前100名球员及其分数,是吗?@Iam619这段代码没有什么问题:如果你已经有了球员分数散列,那么((排序{…}键)[0..99])部分非常简单。这里的“X”是关于这个散列的来源:我不禁想知道为什么它以散列(无序结构)而不是数组(有序结构)的形式返回这样的信息。@Iam619这里的问题是,散列会失去任何顺序,因为它们不是按定义排序的。我最近回答了一个关于哈希结构的问题,这个哈希结构有一个额外的哈希级别来“记住”输入顺序。我建议从这个问题中删除单词“first”。哈希表没有排序,因此没有“第一”的概念。请您解释一下,为什么在您编写的第一种方法中,需要使用
[0..2*N-1]
而不是
[0..N-1]
,就像在第二种方法中一样?感谢you@IvánRodríguezTorres列表上下文中的哈希生成键、值、键、值的列表。。。分配给散列也需要这样一个列表。如果需要100个键,则此列表中需要200个元素。完美。谢谢你澄清
for my $key ( (keys %hashtable)[0..99] ) {
    my $value = $hashtable{$key};
    ...
}