Как использовать хэши в качестве аргументов для подпрограмм в Perl?
Мне было предложено изменить некоторый существующий код, чтобы добавить некоторые дополнительные функции. Я искал в Google и не могу найти ответ. У меня есть что-то по этому поводу...
%first_hash = gen_first_hash();
%second_hash = gen_second_hash();
do_stuff_with_hashes(%first_hash, %second_hash);
sub do_stuff_with_hashes
{
my %first_hash = shift;
my %second_hash = shift;
# do stuff with the hashes
}
Я получаю следующие ошибки:
Odd number of elements in hash assignment at ./gen.pl line 85.
Odd number of elements in hash assignment at ./gen.pl line 86.
Use of uninitialized value in concatenation (.) or string at ./gen.pl line 124.
Use of uninitialized value in concatenation (.) or string at ./gen.pl line 143.
Линии 85 и 86 являются первыми двумя строками в подпрограмме и 124 и 143, где я обращаюсь к хэшам. Когда я просматриваю эти ошибки, кажется, что мои хеши неинициализированы. Тем не менее, я могу проверить, что хеши имеют значения. Почему я получаю эти ошибки?
Ответы
Ответ 1
Хеши сворачиваются в плоские списки, когда вы передаете их в функцию. Таким образом, когда вы смещаете значение из аргументов функции, вы получаете только одно значение. Что вы хотите сделать, это передать хеши по ссылке.
do_stuff_with_hashes(\%first_hash, \%second_hash);
Но тогда вы должны работать с хешами как ссылки.
my $first_hash = shift;
my $second_hash = shift;
Ответ 2
Немного поздно, но
Как уже было сказано, вы должны передавать ссылки, а не хешировать.
do_stuff_with_hashes(\%first_hash, \%second_hash);
Но если вам нужно/хотите использовать ваши хэши как таковые, вы можете разыменовать их imediatly.
sub do_stuff_with_hashes {
my %first_hash = %{shift()};
my %second_hash = %{shift()};
};
Ответ 3
Хеш-ссылки - это путь, как указывали другие.
Предоставление другого способа сделать это только для пинков... потому что кому нужны временные переменные?
do_stuff_with_hashes( { gen_first_hash() }, { gen_second_hash() } );
Здесь вы просто создаете хеш-ссылки на лету (через фигурные скобки вокруг вызовов функций) для использования в вашей функции do_stuff_with_hashes. Это ничего особенного, другие методы столь же действительны и, вероятно, более ясны. Это может помочь в будущем, если вы видите эту активность в своих путешествиях как кто-то новый для Perl.
Ответ 4
Прежде всего,
do_stuff_with_hashes(%first_hash, %second_hash);
"поток" хешей в список, эквивалентный:
( 'key1_1', 'value1', ... , 'key1_n', 'value1_n', 'key2_1', 'value2_1', ... )
а затем вы выбираете один и только один из этих элементов. Итак,
my %first_hash = shift;
похож на:
my %first_hash = 'key1_1';
# leaving ( 'value1', ... , 'key1_n', 'value1_n', 'key2_1', 'value2_1', ... )
У вас не может быть хеш, например { 'key1' }
, так как 'key1'
ничего не отображает.