1

我有以下结构,%hash:

$VAR1 = {
           1 => 5,
           3 => 1,
           2 => 4,
           4 => 9,

        };

此哈希的键代表 id,值代表访问次数:id => 访问次数

我想使用访问次数按降序对其进行排序,并将其存储在另一个哈希中。但这次我希望这些值成为 id。键应该是排名中的位置:在 raking 中的位置(从 1 到 n)=> id

在这种特殊情况下:

$VAR2 = {
           1 => 4,
           2 => 1,
           3 => 2,
           4 => 3,
        };

我该怎么做?

4

3 回答 3

2

您可以在 foreach 循环中使用排序。

my %hash = (
1 => 5,
3 => 1,
2 => 4,
4 => 9,
);

my %hash2;
my $count = 1;
foreach my $key(sort{$hash{$b} <=> $hash{$a}} keys %hash){
    $hash2{$count++} = $key;
}

use Data::Dumper;
print Dumper(\%hash2);

或者

正如大卫所说,您可以使用 map 进行循环。为了简单起见,我添加了 foreach。

my %hash2 = map {$count++ => $_} sort{$hash{$b} <=> $hash{$a}} keys %hash;
于 2013-05-31T05:27:56.813 回答
2

以下代码根据它们各自的值对键(id)进行排序,然后将这些键映射到排名。

use Data::Dumper;

my %old_hash = (
  1 => 5,
  3 => 1,
  2 => 4,
  4 => 9,
);

my $rank = 1;

my %new_hash
  = map  { $rank++ => $_ }
    sort { $old_hash{$b} <=> $old_hash{$a} }
    keys %old_hash;

print Dumper \%new_hash;

如果您向后阅读 map/sort/keys 结构,最容易理解:

首先,列出所有键,其次,按它们索引的值对它们进行排序,第三,映射出一个新的哈希,其中键是当前排名,值是关联的 ID。

于 2013-05-31T05:32:55.123 回答
0

你想对 id 进行排序,所以它看起来像下面这样:

my @ids_by_desc_access =
   sort { ... }
      keys(%accesses_by_id);

您希望它们按访问次数降序排序,因此我们添加了该比较:

my @ids_by_desc_access =
   sort { $accesses_by_id{$b} <=> $accesses_by_id{$a} }
      keys(%accesses_by_id);

最后,您奇怪地想使用散列作为数组。

my %ids_by_desc_access =
   map { $_+1 => $ids_by_desc_access[$_] }
      0..$#ids_by_desc_access;
于 2013-05-31T19:19:44.310 回答