【问题标题】:How can multiple hash values be retrieved using perl?如何使用 perl 检索多个哈希值?
【发布时间】:2020-01-08 09:28:04
【问题描述】:

如何检索多个哈希值?我尝试使用 使用 Hash::MultiValue 和 get_all()。它会抛出一个错误,提示“无法在未定义的值上调用方法“get_all””。哪个是为特定键实现多个值的功能的更好选择?键的值是正在打开的文件。

use warnings;
use List::MoreUtils qw(firstidx);
use Hash::MultiValue;

my $key_in;
…
open ($FR, "<$i") or die "couldn't open list";
 while($line=<$FR>){ 
   if($line =~ /search_pattern/){
   my $idx = firstidx { $_ eq 'hash_key' } @tags;   
   my $key= @tags[$idx+1];
   $hash{$key}= Hash::MultiValue->new($key=>'$i');
} 
close($FR);
for my $key_in ( sort keys %hash ) {
    @key_in = $hash->get_all('$key_in');
    print "$key_in = $hash{$key_in}\n";
}
my $key_in = <STDIN>;
if (exists($hash{$key_in})){
$hash_value = $hash{$key_in};
}else{
    exit;
}

【问题讨论】:

  • 能否举例说明输入文件$i的内容?和标签数组@tags?
  • 该文件仅包含带有各种种子和开关的测试命令
  • 始终使用use strict; use warnings;。您正在使用 $hash 而没有创建这样的 var。这会发现你的错误。
  • '$key_in' 生成字符串$key_in,这肯定不是你想要的!

标签: perl hash reference key


【解决方案1】:

我认为您需要一个数组引用来获取该值。然后,您可以将其视为一个数组。这是我们在Intermediate Perl 中向您展示的那种东西:

 $hash{$key} = [];
 push @{ $hash{$key} }, $some_value;

 my @values = @{ $hash{$key} };

使用 Perl v5.24,您可以使用 postfix dereferencing 让它更漂亮一点:

 use v5.24;

 $hash{$key} = [];
 push $hash{$key}->@*, 'foo';
 push $hash{$key}->@*, 'bar';

 my @values = $hash{$key}->@*;

而且,由于 Perl 自动获取一个未定义的值并将其转换为您需要的引用结构(自动激活),您不需要初始化一个未定义的值:

 use v5.24;

 push $hash{$key}->@*, 'foo';
 push $hash{$key}->@*, 'bar';

 my @values = $hash{$key}->@*;

获取哈希的所有键:

my @keys = keys %hash;

获取所有值(如果您在调用keys 后未更改哈希,则按相应键的顺序):

my @values = values %keys;

使用哈希切片获取一些值:

my @some_values = @hash{@some_keys};

获取一些键和值(key-value slice):

use v5.20;
my %smaller_hash = %hash{@some_keys}

【讨论】:

  • 感谢您的回复。我正在使用 perl 版本 - v5.14.1。我能够打印散列键和值对。但是当我试图将密钥作为用户输入时,我无法获得值对。 $key_in=;我的@some_values = @hash{@key_in};打印“哈希值:@some_values\n”;这给出了数组地址而不是值。
【解决方案2】:

这是一个示例,说明如何使用 Hash::MultiValue 中的 get_all() 检索给定键的多个哈希值:

use strict;
use warnings;
use Data::Dumper qw(Dumper);
use Hash::MultiValue;

my $hash = Hash::MultiValue->new();
$hash->add(tag1 => 'file1');
$hash->add(tag1 => 'file2');
$hash->add(tag2 => 'file3');
my @foo = $hash->get_all('tag1');
print(Dumper(\@foo));

输出

$VAR1 = [
          'file1',
          'file2'
        ];

【讨论】:

  • 当然,使用 Hash::MultiValue 代替哈希会大大减慢您的程序 without making it simpler
  • 感谢您的回复。我尝试过这种方式,但是当我将其中一个键作为用户输入传递,然后尝试调用 get_all 方法时,它会给出错误“无法在未定义的值上调用方法“get_all””我的 $key_in=;我的@values = $hash->get_all('$key_in);
  • @user12401841 “无法在未定义的值上调用方法“get_all”...” 不知何故,$hash 未定义。此外,您可能需要从$key_in 中删除一个尾随换行符。您能否提供您尝试过的完整代码的链接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2018-04-17
  • 1970-01-01
  • 2013-08-26
  • 2014-04-13
  • 2012-02-01
  • 2010-09-16
相关资源
最近更新 更多