在过程中通过引用填充散列

Filling hash by reference in a procedure

我正在尝试调用一个通过引用填充散列的过程。对散列的引用作为参数给出。程序填充了hash,但是当我return时,hash是空的。请看下面的代码。 怎么了?

$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 未定义。因此,sub 中的 $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();