我的哈希包含具有多个值(包含重复项)的键,并保持值唯一,以便我的输出看起来。
$VAR1 = { 'One' => ['code','links','links'],
'Two' => ['indent','indent'],
};
我需要哈希输出如下
`$VAR1 = { 'One' => ['code','links'],
'Two' => ['indent'],
};`
请指教,谢谢。
答案 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}};
请注意 - 如果删除某个项目,则必须将其从哈希和数组中删除。