【问题标题】:Get key name from perl hash using its value使用其值从 perl 哈希中获取键名
【发布时间】:2017-07-25 00:52:19
【问题描述】:

我有 4 个成员的哈希,比如说,

%hash = 
( 

xxx => 8,

yyy => 3,

zzz => 2,

aaa => 2,

)

但是,这里我们只知道“8,3,2,2”,即该哈希中的值,我如何获取和存储值“3”的键名? (没有任何哈希反转,因为反转不会返回重复元素)

【问题讨论】:

  • 所以我们不复习你已经做过的事情,到目前为止你尝试过什么?
  • 我刚刚根据值对哈希进行了排序,然后将其反转。因此,它更改为,8 => xxx,3 => yyy,2 => aaa,由于反转(尝试映射也 - 相同的结果),然后通过访问键作为“3”来提取其值来查找值(这是我们提取的原始键)
  • 使用您尝试过但不起作用的代码更新您的问题。请注意,{} 是哈希引用,() 用于创建哈希。
  • 是的,让我们将特定的键值对存储在新的哈希中。 @melpomene
  • 它是一个哈希引用@stevieb

标签: perl


【解决方案1】:

通过检查目标值的每个键值对

@target_keys = grep { $hash{$_} eq $target_value } keys %hash;

如果您要经常这样做,“反转”散列确实有意义,但在反转散列中使用列表引用作为散列值,以便您可以跟踪原始散列中的多个键何时引用相同的值。

my %reverse_hash = ();
while (my ($k,$v) = each %hash) {
    push @{$reverse_hash}{$v}, $k;
}

...

@target_keys = @{$reverse_hash{$target_value} // []}

【讨论】:

  • 而且,grep 工作正常,谢谢!但是,即使两个或多个键具有相同的值,我们是否有任何精确的方法来使用它的值获取任何一个键?比如 $key = _____ { hash{$_} eq $target_value } keys %hash;
  • ($one_of_the_target_keys) = grep { $hash{$_} eq $target_val } keys %hash
  • 更好的是:use List::Util qw(first); my $key = first { hash{$_} eq $target_val } keys %hash。这将在第一个键处停止,而不是找到所有键然后只使用第一个键。
  • @RameshAravindM:请在您的问题中更新这一点。
猜你喜欢
  • 2016-07-22
  • 2021-12-30
  • 1970-01-01
  • 2020-11-24
  • 2015-01-10
  • 1970-01-01
  • 2012-08-17
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多