Как я могу получить ключи второго уровня в хэше хэшей Perl? - PullRequest
2 голосов
/ 03 декабря 2009

Мне нужно получить все значения для определенного ключа в хэше. Хеш выглядит так:

$bean = {
     Key1 => {
               Key4 => 4,
               Key5 => 9,
               Key6 => 10,
             },
     Key2 => {
               Key7 => 5,
               Key8 => 9,
             },
};

Мне просто нужны значения, например, Key4, Key5 и Key6. Остальное не представляет интереса. Как я могу получить значения?

Обновление: Так что у меня нет %bean, я просто добавляю значения к $bean следующим образом:

 $bean->{'Key1'}->{'Key4'} = $value;

надеюсь, это поможет.

Ответы [ 5 ]

7 голосов
/ 03 декабря 2009
foreach my $key (keys %{$bean{Key1}})
{
  print $key . " ==> " . $bean{Key1}{$key} . "\n";
}

должен печатать:

Key4 ==> 4
Key5 ==> 9
Key6 ==> 10
2 голосов
/ 03 декабря 2009

Если %bean - это хэш хэшей, $bean{Key1} - это ссылка на хэш. Чтобы работать со ссылкой на хеш, как с простым хешем, вам нужно разыменовать его, например:

%key1_hash = %{$bean{Key1}};

И для доступа к элементам в хэше хэшей вы используете синтаксис, подобный следующему:

$element = $bean{Key1}{Key4};

Итак, вот цикл, который печатает ключи и значения для $bean{Key1}:

print $_, '=>', $bean{Key1}{$_}, "\n" for keys %{$bean{Key1}};

Или, если вам нужны только значения и ключи не нужны:

print $_, "\n" for values %{$bean{Key1}};

См. Следующую документацию Perl для получения более подробной информации о работе со сложными структурами данных: perlreftut , perldsc и perllol .

1 голос
/ 03 декабря 2009

См. Поваренная книга структуры данных Perl , где вы найдете множество примеров работы с структурами данных Perl.

1 голос
/ 03 декабря 2009

Еще одно решение:

for my $sh ( values %Bean ) {
    print "$_ => $sh->{$_}\n" for grep exists $sh->{$_}, qw(Key4 Key5 Key6);
}
0 голосов
/ 03 декабря 2009

Хороший способ сделать это - если предположить, что вы публикуете пример, а не один случай, - было бы рекурсивно . Таким образом, у нас есть функция, которая ищет хеш, ищет ключи, которые мы указали, вызывая себя, если находит, что одно из значений является ссылкой на другой хеш.

sub recurse_hash {
  # Arguments are a hash ref and a list of keys to find
  my($hash,@findkeys) = @_;

  # Loop over the keys in the hash
  foreach (sort keys %{$hash}) {

    # Get the value for the current key
    my $value = $hash->{$_};

    # See if the value is a hash reference
    if (ref($value) eq 'HASH') {
      # If it is call this function for that hash
      recurse_hash($value,@findkeys);
    }

    # Don't use an else in case a hash ref value matches our search pattern
    for my $key (@findkeys) {
      if ($key eq $_) {
        print "$_ = $value\n";
      }
    }
  }
}

# Search for Key4, Key5 and Key6 in %Bean
recurse_hash(\%Bean,"Key4","Key5","Key6");

Дает этот вывод:

Key4 = 4
Key5 = 9
Key6 = 10
...