Как можно получить несколько значений ha sh, используя perl? - PullRequest
0 голосов
/ 08 января 2020

Как можно получить несколько значений га sh? Я попытался с помощью использования Ha sh :: 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;
}

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Я думаю, вы хотите ссылку на массив для значения. Затем вы можете рассматривать это как массив. Такого рода вещи мы покажем вам в Промежуточном Perl:

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

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

С Perl v5.24 вы можете использовать разыменование постфикса для сделайте его немного красивее:

 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}->@*;

Получить все ключи га sh:

my @keys = keys %hash;

Получить все значения (в порядке соответствующих ключей, если у вас нет ' t изменил га sh, так как вы позвонили keys):

my @values = values %keys;

Получить некоторые значения с ломтиком ha sh:

my @some_values = @hash{@some_keys};

Получить некоторые ключи и значения ( срез ключа-значения):

use v5.20;
my %smaller_hash = %hash{@some_keys}
1 голос
/ 08 января 2020

Вот пример того, как вы можете использовать get_all() из Hash::MultiValue для получения нескольких значений ha sh для данного ключа:

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'
        ];
...