2013-07-15 1 views
0

Я хотел бы получить значение из хеша хешей, но я этого не делаю. Мой код:Получить значение из хэша хэшей

sub test { 
    my $filename = $_[0]; 
    open INFILE, ${filename} or die $!; 
    my %hashCount; 
    my @firstline = split('\t',<INFILE>); 
    shift(@firstline); 
    while (my $line = <INFILE>) 
    { 
     my %temp; 
     chomp($line); 
     my @line = split('\t', $line); 
     foreach my $cpt (1..$#line) { 
      $temp{$firstline[$cpt-1]}=$line[$cpt]; 
     } 
     $hashCount{$line[0]}={%temp}; 
    } 
    return %hashCount; 
} 
sub get_hash_of_hash { 
    my $h = shift; 
    foreach my $key (keys %$h) { 
     if(ref $h->{$key}) { 
      get_hash_of_hash($h->{$key}); 
     } 
     else { 
      say $h->{$key}; 
     } 
    } 
} 

И когда я показывать мой хэш:

$VAR10679 = 'M00967_43_1106_2493_14707'; 
$VAR10680 = { 
      'A' => '1', 
      'B' => '0', 
      'C' => '1', 
      'D' => '0', 
      'E' => '0' 
     }; 

Моя первая функция возвращает мой хэш хэшей и я получу конкретное значение со второй функцией. Поэтому я хочу, чтобы получить значение как то:

my %hashTest = test("FILE.txt"); get_hash_of_hash(%hashTest,"M00967_43_1106_2493_14707","A") //return value '1'

ответ

1

Вы можете либо доступ вложенных элементов, как

$hash{keyA}{keyB} 

или мы можем написать функцию, которая прогуливается структуру данных, как

sub walk { 
    my ($hashref, @keys) = @_; 
    my $pointer = $hashref; 
    for my $key (@keys) { 
    if (exists $pointer->{$key}) { 
     $pointer = $pointer->{$key}; 
    } else { 
     die "No value at ", join "->", @keys; 
    } 
    } 
    return $pointer; 
} 

, который может быть использован как

my %hash = (
    'M00967_43_1106_2493_14707' => { 
     'A' => '1', 
     'B' => '0', 
     'C' => '1', 
     'D' => '0', 
     'E' => '0' 
    }, 
); 
say walk(\%hash, 'M00967_43_1106_2493_14707', 'A'); 

Примечание: При использовании Data :: Dumper, передавать ссылки функция Dump:

print Dump \%hash; # not print Dump %hash 

Это необходимо, чтобы показать правильную структуру данных.

+0

Спасибо. он работает с $ hash {keyA} {keyB}. Но я думаю, что мой хэш хешифов не установлен, потому что у меня нет «=>» в моем хэше Dumper, как вы '' M00967_43_1106_2493_14707 '=> ' – Tof

1

Ваш хэш держит references в хэши.

Вы можете получить доступ к ним, как это:

$hashTest{'M00967_43_1106_2493_14707'}{'A'}; 

Смотрите perlref для получения дополнительной информации

+0

Yer синтаксис выключен. Perl5 sigils зависят от контекста; вам нужно сказать '$ hashTest {M00967_43_1106_2493_14707} {A}': с '$', а не '%'. (о, оба цитаты вокруг ключей и '->' являются необязательными) – amon

+0

@amon: Dang! Вы совершенно правы. Я отредактирую его. – Demnogonis

0

Используйте эту подпрограмму ..

sub get_hash_of_hash { 
     my $h = shift; 
     foreach my $key (keys %$h) { 
      if(ref $h->{$key}) { 
       get_hash_of_hash($h->{$key}); 
      } 
      else { 
       print $h->{$key}; 
      } 
     } 
    } 
+0

Извините, но я использую «use strict;» и у меня есть сообщение об ошибке. Я делаю 'my% hashTest = test ('FILE.txt'); а затем get_hash_of_hash (% hashTest, «M00967_43_1106_2493_14707», «Всего»); '? – Tof

+0

так что ошибка u r сталкивается снова, я не получил u ?? –

+0

Невозможно использовать строку («M00967_43_000000000-A3JHG_1_1106» ...) как HASH ref, в то время как «строгие ссылки» используются в ./count_table.pl строке 30, строка 5341. – Tof

 Смежные вопросы

  • Нет связанных вопросов^_^