我们试图将多个散列与一堆标量一起作为参数传递给子例程。问题在于这个子程序的多次调用,(如果我们在函数内部检索到两个哈希后打印它们),只有一个(第一个)得到正确的值。第二个是空的。我们尝试了很多东西-
1 ) 来自 Stackoverflow/PerlMonks 等具有不同语法的两个独立哈希,并作为参考传递。
&mySub(\%hash0, \%hash1, $var0, $var1, $var2);
sub mySub{
my (%hash0, %hash1, $var0, $var1, $var2) = (@_);
}
或者
&mySub(\%hash0, \%hash1, $var0, $var1, $var2);
sub mySub{
my %hash0 = %{$_[0]};
my %hash1 = %{$_[1]};
my $var0 = $[2]; my $var1 = $[3]; my $var3 = $[4];
}
2)创建两个哈希数组并传递
my @joined_arr = (\%hash0, \%hash1);
&mySub (\@joined_arr, $var0, $var1, $var2);
sub mySub{
my (@joined_arr, $var0, $var1, $var2) = (@_);
my %hash0 = %{joined_arr[0]};
my %hash1 = %{joined_arr[1]};
# rest of the variables.
}
4 ) 创建哈希值并通过
my %joined_hash;
%joined_hash{"first_one"} = %hash0;
%joined_hash{"second_one"} = %hash1;
&mySub (\%joined_hash, $var0, $var1, $var2);
sub mySub{
my %joined_hash, %hash0, %hash1;
%joined_hash = %{$_[0]};
%hash0 = %joined_hash{"first_one"};
%hash1 = %joined_arr{"second_one"};
# rest of the variables.
}
- 在 Perl 5.16(CentOS 7 的默认发行版)和 Perl 5.30 中尝试它们。
到目前为止,这还没有成功。如果有人有想法并愿意分享,那将是很大的帮助。
编辑
在@zdim 和@Polar Bear 的建议下,我尝试了这些东西->
将 @_ 卸载到函数内部的标量的语法 ->
一个)
my ($ref_to_hash0, $ref_to_hash1, $var0, $var1, $var2) = @_;
b)
$ref_to_hash0 = shift;
$ref_to_hash1 = shift;
$var0 = shift;
$var1 = shift;
$var2 = shift;
我也尝试过这 3 种散列引用风格的散列赋值。
一个)
my %local_hash_shallow_copy = %$ref_to_hash0;
b)
my $local_hashref_deep_copy = dclone $ref_to_hash0;
C)
my %local_hash_shallow_copy = %{$ref_to_hash0};
似乎在这个 sub 调用的 9 次迭代中,我在 sub 2 内得到了正确的哈希值。在其他时候,我只是简单地丢了一个指针-
$VAR1 = {
'HASH(0x1e32cc8)' => undef
};
我正在使用 Dumper 将散列转储在外部 - 就在子调用之前,并且就在内部 - 就在我将值从 ref 转移到实际散列之后。这应该避免任何愚蠢的错误。
要么我在这里犯了一个非常基本的错误,要么遇到了一个不可思议的问题。正在调试它。
供参考。