Как передать хэш подпрограмме Perl? - PullRequest
4 голосов
/ 27 марта 2010

В одной из моих основных (или основных) подпрограмм у меня есть два или более хешей. Я хочу, чтобы подпрограмма foo () получала эти несколько возможных хешей как отдельные хеши. Прямо сейчас у меня нет предпочтений, если они идут по значению или в качестве ссылок. Я борюсь с этим в течение последних многих часов и был бы признателен за помощь, так что мне не нужно оставлять Perl для PHP! (Я использую mod_perl, или буду)

Сейчас у меня есть ответ на мое требование, показанный здесь

С http://forums.gentoo.org/viewtopic-t-803720-start-0.html

# sub: dump the hash values with the keys '1' and '3' 
sub dumpvals 
{ 
   foreach $h (@_) 
   { 
      print "1: $h->{1}   3: $h->{3}\n"; 
   } 
} 

# initialize an array of anonymous hash references 
@arr = ({1,2,3,4}, {1,7,3,8}); 

# create a new hash and add the reference to the array 
$t{1} = 5;
$t{3} = 6;
push @arr, \%t; 

# call the sub 
dumpvals(@arr);

Я только хочу расширить его, чтобы в dumpvals я мог сделать что-то вроде этого:

foreach my %k ( keys @_[0]) {
    # use $k and @_[0], and others
}

Синтаксис неправильный, но я предполагаю, что вы можете сказать, что я пытаюсь получить ключи первого хеша (hash1 или h1) и перебрать их.

Как это сделать в последнем фрагменте кода выше?

Ответы [ 2 ]

4 голосов
/ 27 марта 2010

Я считаю, что это то, что вы ищете:

sub dumpvals {
    foreach my $key (keys %{$_[0]}) {
        print "$key: $_[0]{$key}\n";
    }
}
  • Элементом массива аргументов является скаляр, поэтому вы получаете доступ к нему как $_[0], а не @_[0].

  • ключи работают с хэшами, а не с хэш-ссылками, поэтому вам нужно разыменовать, используя %

  • И, конечно же, ключи являются скалярами, а не хешами, поэтому вы используете my $key, а не my %key.

3 голосов
/ 27 марта 2010

Чтобы dumpvals сбросил содержимое всех хэшей, переданных ему, используйте

sub dumpvals {
  foreach my $h (@_) {
    foreach my $k (keys %$h) {
      print "$k: $h->{$k}\n";
    }
  }
}

Его вывод при вызове как в вашем вопросе

1: 2
3: 4
1: 7
3: 8
1: 5
3: 6
...