Вопрос по perl, hash, subroutine, parameters – Как я могу использовать хэши в качестве аргументов для подпрограмм в Perl?

23

Меня попросили изменить существующий код, чтобы добавить некоторые дополнительные функции. Я искал в 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 - это место, где я получаю доступ к хэшам. Когда я смотрю на эти ошибки, кажется, что мои хеши неинициализированы. Тем не менее, я могу проверить, что хэши имеют значения. Почему я получаю эти ошибки?

Это дубликат. Пожалуйста, посмотрите наstackoverflow.com/questions/944784 innaM

Ваш Ответ

4   ответа
9

Предоставление другого способа сделать это только для удовольствия ... потому что кому нужны временные переменные?

do_stuff_with_hashes( { gen_first_hash() }, { gen_second_hash() } );

Здесь вы просто создаете хеш-ссылки на лету (через фигурные скобки вокруг вызовов функций) для использования в функции do_stuff_with_hashes. В этом нет ничего особенного, остальные методы так же действительны и, вероятно, более понятны. Это может помочь в будущем, если вы увидите эту активность в своих путешествиях как кого-то нового в Perl.

Отличный трюк! Я буду держать это вокруг. predhme
Рады обязать. Одна вещь, о которой следует помнить, если вы останетесь в Perl, это то, что все укажут, как «существует более одного способа сделать это». Это своего рода благословение и проклятие (в зависимости от вашего мнения о таких вещах) в программировании на Perl. Повеселись!
16

Как уже было сказано, вы должны передавать ссылки, а не хэши.

do_stuff_with_hashes(\%first_hash, \%second_hash);

Но если вам нужно / хотите использовать ваши хэши как таковые, вы можете немедленно разыменовать их.

sub do_stuff_with_hashes {
    my %first_hash = %{shift()};
    my %second_hash = %{shift()};
};
чтобы быть ясным, я не разыменовываю хэши, я их копирую.
24

когда вы передаете их в функцию. Таким образом, когда вы перемещаете значение из аргументов функции, вы получаете только одно значение. Что вы хотите сделать, это передать хэш по ссылке.

do_stuff_with_hashes(\%first_hash, \%second_hash);

Но тогда вы должны работать с хэшами в качестве ссылок.

my $first_hash  = shift;
my $second_hash = shift;
Понятно ... Вот и все ... Спасибо большое! predhme
7

Прежде всего,

 do_stuff_with_hashes(%first_hash, %second_hash);

& Quot; потоки & Quot; хеши в список, эквивалентный:

 ( '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' ничего не сопоставляет.

Спасибо за объяснение того, что происходило за кулисами. predhme

Похожие вопросы