Замена хэша переменной при вызове функции

#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);