我试图调用一个过程,通过引用填充哈希。到散列参考被给定为一个参数。该过程填充散列,但是当我回来时,哈希是空的。请参阅下面的代码。怎么了?
$hash_ref;
genHash ($hash_ref);
#hash is empty
sub genHash {
my ($hash_ref)=(@_);
#cut details; filling hash in a loop like this:
$hash_ref->{$lid} = $sid;
#hash is generetad , filled and i can dump it
}
你可能想先初始化hashref,
my $hash_ref = {};
作为内部自动激活功能,将发生到另一个词法变量。
(不太好)替代方案是使用@_
阵列内标量,其被直接别名为原始变量,
$_[0]{$lid} = $sid;
和顺便说一句,考虑到use strict; use warnings;
所有脚本。
呼叫者的$hash_ref
是不确定的。在子的$hash_ref
因此不确定了。 $hash_ref->{$lid} = $sid;
autovivifies子的$hash_ref
,但没有分配散列参考呼叫者的$hash_ref
。
解决方法1:其实传递一个哈希裁判分配给呼叫者的$hash_ref
。
sub genHash {
my ($hash_ref) = @_;
...
}
my $hash_ref = {};
genHash($hash_ref);
解决方案2:在充分考虑是Perl经过参考的事实。
sub genHash {
my $hash_ref = $_[0] ||= {};
...
}
my $hash_ref;
genHash($hash_ref);
-or-
genHash(my $hash_ref);
解决方案3:如果散列将是空的开始,为什么不直接在子创造呢?
sub genHash {
my %hash;
...
return \%hash;
}
my $hash_ref = genHash();