通过引用在过程填充散列

问题描述 投票:0回答:2

我试图调用一个过程,通过引用填充哈希。到散列参考被给定为一个参数。该过程填充散列,但是当我回来时,哈希是空的。请参阅下面的代码。怎么了?

$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
}
perl hash reference
2个回答
2
投票

你可能想先初始化hashref,

my $hash_ref = {};

作为内部自动激活功能,将发生到另一个词法变量。

(不太好)替代方案是使用@_阵列内标量,其被直接别名为原始变量,

$_[0]{$lid} = $sid;

和顺便说一句,考虑到use strict; use warnings;所有脚本。


2
投票

呼叫者的$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();
© www.soinside.com 2019 - 2024. All rights reserved.