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

4 ответов


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

do_stuff_with_hashes(\%first_hash, \%second_hash);

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

my $first_hash  = shift;
my $second_hash = shift;

немного поздно, но,

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

do_stuff_with_hashes(\%first_hash, \%second_hash);

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

sub do_stuff_with_hashes {
    my %first_hash = %{shift()};
    my %second_hash = %{shift()};
};

хэш-ссылки-это путь, как указывали другие.

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

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

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


во-первых,

 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' отображение в ничто.