我该如何将哈希传递给Perl子例程?

4
在我的主要例程中,我有两个或多个哈希表。我希望子例程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)的键,并对它们进行迭代。如何在上面的后面的代码片段中实现?

你应该在每个脚本和模块的顶部始终使用 use strict; use warnings; - Ether
2个回答

4
我相信这就是你要找的内容:
sub dumpvals {
    foreach my $key (keys %{$_[0]}) {
        print "$key: $_[0]{$key}\n";
    }
}
  • 参数数组的元素是标量,所以要使用$_[0]而不是@_[0]来访问它。

  • keys操作的是哈希,而不是哈希引用,所以需要使用%进行解引用。

  • 当然,键是标量,而不是哈希,所以你需要使用my $key而不是my %key


3

要使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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接