Perl: Hash ref для доступа к массиву ключей - PullRequest
15 голосов
/ 15 ноября 2011

У меня есть вопрос, который кажется основным, но я не могу понять.Скажи, что у меня есть ссылка на хеш в Perl.Я хочу получить массив значений через массив ключей.

Вот как это будет работать с хешем, а не с хеш-ссылкой:

my %testHash = ( "a" => 1, "b" => 2, "c" => 3 );
my @testKeys = ("a", "b", "c");

my @testValues = @testHash{@testKeys};

Теперь предположим, что у меня есть хеш-ссылка,

my $hashRef = {"a" => 1, "b" => 2, "c" => 3};
* 1008пробовал следующие два способа:
my @values = @{$hashRef->{@testKeys}};
my @values = $hashRef->{@testKeys};

Но ни один из них не является правильным.Есть ли правильный путь, или мне просто нужно разыменовывать хеш-ссылку каждый раз, когда я хочу это сделать?

1 Ответ

21 голосов
/ 15 ноября 2011

Ты рядом:

my @values = @$hashref{@testKeys};     ## (1)

или

my @values = @{$hashref}{@testKeys};   ## (2)

Дополнительные примеры см. «Ломтики» в документации по perllol .

«Использование ссылок» в документации perlref содержит общие правила.

1. Везде, где вы бы поместили идентификатор (или цепочку идентификаторов) как часть имени переменной или подпрограммы, вы можете заменить идентификатор простой скалярной переменной, содержащей ссылку правильного типа.

Это объясняет, почему (1) работает: вы заменили идентификатор testHash на простой скаляр $hashRef.

2. Везде, где вы бы поместили идентификатор (или цепочку идентификаторов) как часть имени переменной или подпрограммы, вы можете заменить идентификатор на БЛОК, возвращающий ссылку правильного типа.

Приведенный выше фрагмент кода (2) почти такой же, но с более объемным синтаксисом. Вместо идентификатора testHash вы пишете блок, возвращающий ссылку на хеш, , т.е. , {$hashRef}.

Здесь фигурные скобки заключают в себе добросовестный блок, так что вы можете вычислить и вернуть ссылку, как в

push @{ $cond ? \@a1 : \@a2 }, "some value";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...