Как я могу использовать хеши в качестве аргументов подпрограммам в Perl?

Моим всем фаворитом времени является, вероятно, "Sudo xkcd, делают меня тестовым" комиком, но существует СТОЛЬКО хороших webcomics там, что я думал, что выведу некоторых других для забавы:

коллега А указал на меня на Палки и Камни , который просто начал симпатичный недавно. Это - вид xkcd грабежа, но там существует некоторый хороший материал. сопроводительный текст http://www.arcanology.net/sticksandstones/comics/comic-10.gif

Перья часто о программировании. Это, вероятно, мой фаворит: Перья, Drake Emko & Jen Brodzik http://hackles.org/strips/cartoon334.png Это - не совсем комик программирования, но я также действительно вырыл эту полосу от Полный Лобный Nerdery:

Полный Лобный Nerdity Aaron Williams http://nodwick.humor.gamespy.com/ffn/strips/2008-03-12.jpg

25
задан Sinan Ünür 21 July 2009 в 20:54
поделиться

4 ответа

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

do_stuff_with_hashes(\%first_hash, \%second_hash);

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

my $first_hash  = shift;
my $second_hash = shift;
26
ответ дан 28 November 2019 в 18:31
поделиться

Hash references are the way to go, as the others have pointed out.

Providing another way to do this just for kicks...because who needs temp variables?

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

Here you are just creating hash references on the fly (via the curly brackets around the function calls) to use in your do_stuff_with_hashes function. This is nothing special, the other methods are just as valid and probably more clear. This might help down the road if you see this activity in your travels as someone new to Perl.

9
ответ дан 28 November 2019 в 18:31
поделиться

Во-первых,

 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' не отображается ни в какую.

7
ответ дан 28 November 2019 в 18:31
поделиться

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

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

do_stuff_with_hashes(\%first_hash, \%second_hash);

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

sub do_stuff_with_hashes {
    my %first_hash = %{shift()};
    my %second_hash = %{shift()};
};
16
ответ дан 28 November 2019 в 18:31
поделиться
Другие вопросы по тегам:

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