#function #perl #hash
#функция #perl #хэш
Вопрос:
Что я хочу сделать, так это заменить вызов функции:
my_function({'param1' => 123, 'param2' => 456});
с помощью:
my %tmp = {'param1' => 123, 'param2' => 456};
my_function(%tmp);
Я получаю сообщение об ошибке во время выполнения:
Can't use string ("HASH(0x16cffb0)") as a HASH ref while "strict refs" in use
Что я делаю не так?
Ответ №1:
Это не делает то, что вы хотите:
my %tmp = {param1 => 123, param2 => 456};
Вы пытаетесь присвоить хэш-ссылку хэшу. Это вызывает предупреждение:
Reference found where even-sized list expected at -e line 4.
Мораль: всегда use strict; use warnings;
, поэтому такая ошибка быстро обнаруживается.
Ваша функция, похоже, принимает ссылку на хэш в качестве аргумента. Итак, либо создайте хэш и передайте его по ссылке:
my %tmp = (param1 => 123, param2 => 456);
my_function(%tmp);
Или создайте ссылку на хэш и передайте ее как есть:
my $tmp = {param1 => 123, param2 => 456};
my_function($tmp);
Ответ №2:
Ваша функция выглядит так, как будто она ожидает ссылку на хэш (который является скаляром в Perl):
my $tmp = {'param1' => 123, 'param2' => 456};
my_function($tmp);
Фигурные скобки ( {}
) используются для создания ссылки на хэш.
Обратитесь к perldoc perlreftut
Ответ №3:
my %tmp = {'param1' => 123, 'param2' => 456};
Хэш инициализируется списком. И списки определяются с помощью круглых скобок:
my %tmp = ('param1' => 123, 'param2' => 456);
Затем вы можете взять ссылку на этот хэш и передать ссылку своей подпрограмме:
my_function(%tmp);
В качестве альтернативы, вы можете использовать { ... }
для создания анонимного хэша и немедленного получения ссылки на него:
# Note that $tmp is a scalar as it contains
# a reference, not a hash.
my $tmp = {'param1' => 123, 'param2' => 456};
Затем вы можете передать эту ссылку своей подпрограмме:
my_function($tmp);