Вопрос

У меня есть такой хэш:

my %h = ( a => { one => 1,
                 two => 2
             },
          b => { three => 3,
                 four => 4
             },
          c => { five => 5,
                 six => 6
             }
      );

print join(',', @{$h{a}{qw/one two/}});

Я получаю следующую ошибку:Не могу использовать неопределенное значение в качестве ссылки на массив в Q.pl Line 17, которая является линией с печати.

Я ожидал 1,2

Это было полезно?

Решение

Чтобы получить фрагмент хеша из вложенного хэша, вам необходимо поэтапно отменить ссылку на него.Вы получаете первый уровень, который вам нужен:

$h{'a'}

Теперь вам нужно разыменовать это как хеш.Однако, поскольку это не простой скаляр, его необходимо поместить в фигурные скобки.Чтобы получить весь хеш, вы должны поместить % перед брекетами:

%{ $h{'a'} }

Теперь вам нужен фрагмент, поэтому вы заменяете % с @, поскольку вы получаете несколько элементов и, как обычно, помещаете свои ключи в конце:

@{ $h{'a'} }{ @keys }

Возможно, будет проще увидеть фигурные скобки отдельно:

@{         }{       }
   $h{'a'}    @keys

Чтобы сделать это проще, в версии 5.20 появился разыменование постфикса.Вместо того, чтобы заключать что-то в фигурные скобки и работать изнутри наружу, вы можете работать слева направо:

$h{a}->@{qw/one two/};

Что @ это то же самое, что вы видели перед первой скобкой.Вы по-прежнему знаете, что это фрагмент хэша, потому что за сигилой стоит фигурная скобка.

Другие советы

пытаться

print join(',',@{$h{'a'}}{qw/one two/});

использование Data::Dumper очень помогает в подобных случаях

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top