我仍在努力梳理我的哈希解引用。 我当前的问题是现在将哈希引用传递给子例程,并且我想在该子例程中对其进行解引用。 但是,我没有找到正确的方法/语法来完成它。 在子例程中,我想迭代哈希键,但是哈希引用的语法与哈希不同,而我知道如何处理哈希。
所以我想做的是:
sub foo {
%parms = @_;
foreach $keys (key %parms) { # do something };
}
但是使用哈希引用(hashref)代替哈希表进行传递。
我仍在努力梳理我的哈希解引用。 我当前的问题是现在将哈希引用传递给子例程,并且我想在该子例程中对其进行解引用。 但是,我没有找到正确的方法/语法来完成它。 在子例程中,我想迭代哈希键,但是哈希引用的语法与哈希不同,而我知道如何处理哈希。
所以我想做的是:
sub foo {
%parms = @_;
foreach $keys (key %parms) { # do something };
}
但是使用哈希引用(hashref)代替哈希表进行传递。
我目前还没有测试过这段代码,但是根据手写的内容,您需要像这样做:
sub foo {
$parms = shift;
foreach my $key (keys %$parms) { # do something };
}
以下是一种解引用传递给子例程的哈希引用的方法:
use warnings;
use strict;
my %pars = (a=>1, b=>2);
foo(\%pars);
sub foo {
my ($href) = @_;
foreach my $keys (keys %{$href}) { print "$keys\n" }
}
__END__
a
b
参考资料还包括参考快速指南和perlreftut
sub foo
{
my $params = $_[0];
my %hash = %$params;
foreach $keys (keys %hash)
{
print $keys;
}
}
my $hash_ref = {name => 'Becky', age => 23};
foo($hash_ref);
这里有一个有关引用的良好简介,在这里。
#!/usr/bin/perl
use strict;
my %params = (
date => '2010-02-17',
time => '1610',
);
foo(\%params);
sub foo {
my ($params) = @_;
foreach my $key (keys %$params) {
# Do something
print "KEY: $key VALUE: $params{$key}\n";
};
}
sub foo {
my ($parmsHashRef , $parmsArrRef) = @_;
# for hashes, \%$parmsHashRef - would not work (seems would be a "reference" on another reference already)
my $newDetachedHashRef = {%$parmsHashRef} # or just = {$parmsHashRef}
# for arrays , \@$parmsArrRef - would not work
my $newDetachedArrRef = [@$parmsArrRef] # or just = [$parmsArrRef]
}
shift
和@_
的区别不重要。使用my ($hashref) = @_;
同样有效。 - nobodyshift
和@
之间确实存在显著差异。没有括号的@
my $hashref = @_;
将返回一个标量(=传递的参数数目)或最终用作此参数传递的整个数组。只有在您的“解构”赋值方式my ($hashref) = @_;
中才能起到相同的作用。 - FantomX1