在过程中通过引用填充散列
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();
我正在尝试调用一个通过引用填充散列的过程。对散列的引用作为参数给出。程序填充了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();