Perl哈希键的多个值

时间:2017-05-23 03:32:33

标签: perl perl-data-structures

我的哈希包含具有多个值(包含重复项)的键,并保持值唯一,以便我的输出看起来。

$VAR1 = { 'One' => ['code','links','links'],
'Two' => ['indent','indent'],
};

我需要哈希输出如下

`$VAR1 = { 'One' => ['code','links'],
'Two' => ['indent'],
};`

请指教,谢谢。

1 个答案:

答案 0 :(得分:1)

你的价值观需要保持秩序吗?如果没有,你可以使用另一层哈希。您不必执行push @{$hash{$key}}, $value;,而只需执行$hash{$key}{$value}++; - 现在keys %{$hash{$key}}会显示$key的唯一值。订单匹配输入有时会以小集随机发生。通常不会发生。

但是,如果您必须维护订单,则可以使用AntonH间接建议的uniq。另一个选项,如果您不经常需要排序列表,即,如果您添加到列表中的次数超过查询次数,则将使用哈希值,但添加当前订单值以便对其进行排序。例如:

# to "push"
$hash{$key}{$value} ||= scalar keys %{$hash{$key}} + 1;

# to get the list (Schwartzian Transform method)
my @values = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map {
  [ $hash{$key}{$_}, $_ ] } keys %{$hash{$key}};

然后,从这里开始,您可以创建一个同时执行这两个操作的数据结构 - 存储列表和哈希值,只有在哈希值中没有值时才允许添加到列表中。我假设这是Hash::Ordered之类的模块,即使不是纯粹的perl。

# push
unless ($hash{hashes}{$key}) {
    push @{$hash{arrays}{$key}}, $value;
    $hash{hashes}{$key}{$value} = 1;
}

# get list
my @values = @{$hash{arrays}{$key}};

请注意 - 如果删除某个项目,则必须将其从哈希和数组中删除。