Как установить список скаляров из ссылки на хэш 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 - это способ, чтобы убедиться, что порядок соответствует ожидаемому, и не забывайте использовать предупреждения во всем своем коде.