【问题标题】:Reversing a multi-value hash in perl在 perl 中反转多值哈希
【发布时间】:2010-07-20 00:45:51
【问题描述】:

我有一个看起来像这样的哈希:

{ bmw      => { id => 1, color => brown } }
{ mercedes => { id => 2, color => black } }

我想在 perl 中反转这个哈希,这样我就可以得到一个 id => name_of_car 的映射。我是否需要以某种方式使用反向功能?

注意:我总是可以遍历原始散列并在新散列中相应地分配键和值,我想知道是否有更巧妙的方法。

【问题讨论】:

  • 我认为您应该接受我们的答案之一。你怎么能比 Kinopiko 的一个班轮更光滑?

标签: perl


【解决方案1】:

不需要花哨的方法:

my %h = (
    bmw      => { id => 1, color => "brown" } ,
    mercedes => { id => 2, color => "black" } 
);
my %j = map { ($h{$_}{id} => $_) } keys %h;

for (keys %j) {
    print "$_ $j{$_}\n";
}

输出:

$ ./silly.pl 1 宝马 2辆奔驰

【讨论】:

  • 嘿,无需担心您的解决方案。你的方式对我来说看起来很漂亮:)。
  • 这只是通常的方式。
  • 我看到我们对“slick”的定义不同
【解决方案2】:

您发布的内容不是有效的 perl,但我想我理解您的意思。一种巧妙的方法是使用hash slice 和地图。

my %hash = (
    bmw      => { id => 1, color => 'brown' },
    mercedes => { id => 2, color => 'black' },
);
my %new_hash;
@new_hash{ map { $_->{id} } values %hash } = keys %hash;

【讨论】:

  • 为什么在new_hash之前的最后一行使用了别名(@)符号?
  • @syker:请查看 masonk 提供的关于“hash slice”的链接。
  • 这是哈希切片的特殊语法(上面链接)。您在左侧提供一个键列表,在右侧提供一个值列表。 Perl 保证返回值 %hash 的顺序与返回键 %hash 的顺序相同,所以这是可行的。
猜你喜欢
  • 2011-09-02
  • 2016-07-22
  • 2014-07-17
  • 2010-10-20
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
相关资源
最近更新 更多