【问题标题】:Perl hash multiple values for a key [duplicate]Perl散列一个键的多个值[重复]
【发布时间】:2023-03-20 16:53:01
【问题描述】:
我的哈希包含具有多个值的键(包含重复项)并保持值唯一,以便我的输出看起来。
$VAR1 = { 'One' => ['code','links','links'],
'Two' => ['indent','indent'],
};
我需要如下的哈希输出
`$VAR1 = { 'One' => ['code','links'],
'Two' => ['indent'],
};`
请指教,谢谢。
【问题讨论】:
标签:
perl
perl-data-structures
【解决方案1】:
您的价值观需要维持其秩序吗?如果没有,您可以只使用另一层哈希。而不是执行push @{$hash{$key}}, $value;,您只需执行$hash{$key}{$value}++; - 现在keys %{$hash{$key}} 将显示该$key 的唯一值。有时,订单匹配输入会随机出现在小集合中。通常不会发生。
但是,如果您必须维护订单,您可以使用 uniq,正如 AntonH 间接建议的那样。另一种选择,如果您不经常需要排序列表,即,如果您添加到列表中的数量超过查询,则使用散列,但添加当前顺序值以便您可以对它们进行排序。例如:
# 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}};
请注意 - 如果您删除一个项目,您必须将其从哈希和数组中删除。