как grep Perl Hash Keys в массив? - PullRequest
       13

как grep Perl Hash Keys в массив?

3 голосов
/ 07 декабря 2009

Я новичок в Perl и нуждаюсь в помощи для понимания кода ниже.

У меня есть Perl Hash, определенный так

1   my %myFavourite = ("Apple"=>"Apple");
2   my @fruits = ("Apple", "Orange", "Grape");
3   @myFavourite{@fruits}; # This returns Apple. But how?

Было бы замечательно, если бы Perl-гуру могли объяснить, что происходит в строке 3 приведенного выше кода. myFavourite объявлен имеет хэш, но используется как массив? И оператор просто берет ключ хеша, вставляет его в массив и возвращает значения хеша, соответствующие искомому ключу. Это то, как мы добавляем Hash Keys в массив?

Ответы [ 2 ]

6 голосов
/ 07 декабря 2009

Это не возвращает Apple. Он оценивает срез хэша, состоящий из всех значений в хэше, соответствующих ключам в @fruits. Обратите внимание, если вы включаете предупреждения, что вы получаете 2 предупреждения о неинициализированных значениях. Это связано с тем, что myFavourite не содержит значений для ключей Orange и Grape. Посмотрите на 'hash slice' в perldata.

По существу, @myFavourite{@fruits} является сокращением для ($myFavourite{Apple}, $myFavourite{Orange}, $myFavourite{Grape}), которое в данном случае равно ($myFavourite{Apple},undef,undef). Если вы распечатаете его, вы увидите только вывод Apple.

5 голосов
/ 07 декабря 2009

у myFavourite объявлен хэш, но он используется как массив?

Да, и возвращает список.Это кусок хеша.См .: http://perldoc.perl.org/perldata.html

Думайте об этом как о расширении массива @fruits в несколько поисков хеш-ключей.Синтаксис @hash {@keys} - это просто удобный способ извлечения частей хеша.

В частности:

@myFavourite{@fruits}

эквивалентно:

($myFavourite{'Apple'},$myFavourite{'Orange'},$myFavourite{'Grape'})

который возвращает список из трех элементов при вызове в контексте списка или объединение всех трех элементов в скалярном контексте (например, печать)

my @slice_values = @myFavourite{@fruits}
# @slice_values now contains ('Apple',undef,undef)
# which is functionally equivalent to:
my @slice_values = map { $myFavourite{$_} } @fruits;

Если вы хотите извлечь хеш-значения только с ключами, выполните:

my @favourite_fruits = @myFavourite{ grep { exists $myFavourite{$_} } @fruits };
# @favourite_fruits now contains ('Apple')

Если вы:

use warnings;

, вы увидите предупреждения интерпретаторов о том, что два неинициализированных значения автоматически автовивифицированы как undef.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...