Как установить список скаляров из ссылки на хэш perl?

Как установить список скаляров из хэша Perl?

use strict;
my $my_hash = { field1=>'val1', field2=>'val2', field3=>'val3', };
my ($field1,$field2,$field3) = %{$my_hash}{qw(field1 field2 field3)};

print "field1=$field1\nfield2=$field2\nfield3=$field3\n";

2 ответа

Решение

Вы ищете фрагмент хеша, который в вашем случае будет выглядеть так:

my ($field1,$field2,$field3) = @{$my_hash}{qw(field1 field2 field3)};

или вот так:

my ($field1,$field2,$field3) = @$my_hash{qw(field1 field2 field3)};

Если мы упростим вещи так, что вы работаете с прямым хешем, а не с хеш-реф, мы можем убрать часть шума, и синтаксис будет выглядеть немного яснее:

my %my_hash = ( field1=>'val1', field2=>'val2', field3=>'val3' );
my ($field1, $field2, $field3) = @my_hash{  qw(field1 field2 field3)  };
# we want an array/list ---------^       ^  ^
# but my_hash is a hash -----------------/  |
# and we want these keys (in this order) ---/
# so we use a qw()-array

Тогда мы можем добраться до вашего $my_hash версия hash-ref, заменив hash-ref обычным способом.

Следующее работает просто отлично:

#!/usr/bin/perl
use warnings;
use strict;
my $my_hash = { field1=>'val1', field2=>'val2', field3=>'val3', };
my ($field1,$field2,$field3) = (values %{$my_hash});
print "field1=$field1\nfield2=$field2\nfield3=$field3\n";

но посмотрите следующее, почему это не будет работать хорошо:

Perl гарантированно возвращает последовательно упорядоченные ключи хеша?

Пример этого происходит неправильно:

my $my_hash = { field1=>'val1', blah=>'val1.1', field2=>'val2', field3=>'val3', };
my ($field1,$field2, $blah,$field3) = (sort values %{$my_hash});
print "field1=$field1\nfield2=$field2\nblah=$blah\nfield3=$field3\n";

выход:

field1=val1
field2=val1.1
blah=val2
field3=val3

Обратите внимание, что значение $field1 здесь неверно. Поскольку "mu слишком короток" уже отметил, что Hash Slice - это способ, чтобы убедиться, что порядок соответствует ожидаемому, и не забывайте использовать предупреждения во всем своем коде.

Другие вопросы по тегам