为什么在传递给子例程时对数组的引用会更改为散列引用
Why does a reference to an array change to a hash reference when passed to a subroutine
我在试图修复的工具中遇到了这个问题,但不明白是什么原因导致数组引用更改为散列引用。它仅在参数中的哈希引用之后列出数组引用时发生,这让我认为这是由于接收参数的方式所致。
我没有该工具的代码,但下面的代码重现了当时的情况。
use strict;
use warnings;
sub PassArrRef{
my @array = [0,1,2,3,4];
my %hash = {0,'a',1,'b',2,'c'};
RecieveHashRef(\%hash, \@array)
}
sub RecieveHashRef{
my %hash = %{$_[0]};
my $arrayref = shift;
print $arrayref;
}
PassArrRef();
此代码输出哈希引用。
这是因为在 ReceiveHashRef
中您直接引用了第一个位置参数,$_[0]
然后在下一行调用 shift
获取位置参数的第一个元素。一样的。
使用子例程参数的典型方式是:
my($hashref, $arrayref) = @_;
完全修复,您的代码应如下所示。 diagnostics
pragma 将为您提供更广泛的错误解释。
use strict;
use warnings;
use diagnostics;
sub PassArrRef{
my @array = (0,1,2,3,4);
my %hash = (0,'a',1,'b',2,'c');
ReceiveHashRef(\%hash, \@array)
}
sub ReceiveHashRef{
my($hashref, $arrayref) = @_;
print "hash ref: $hashref, array ref: $arrayref\n";
}
PassArrRef();
并充分利用 https://perldoc.perl.org/!
我在试图修复的工具中遇到了这个问题,但不明白是什么原因导致数组引用更改为散列引用。它仅在参数中的哈希引用之后列出数组引用时发生,这让我认为这是由于接收参数的方式所致。
我没有该工具的代码,但下面的代码重现了当时的情况。
use strict;
use warnings;
sub PassArrRef{
my @array = [0,1,2,3,4];
my %hash = {0,'a',1,'b',2,'c'};
RecieveHashRef(\%hash, \@array)
}
sub RecieveHashRef{
my %hash = %{$_[0]};
my $arrayref = shift;
print $arrayref;
}
PassArrRef();
此代码输出哈希引用。
这是因为在 ReceiveHashRef
中您直接引用了第一个位置参数,$_[0]
然后在下一行调用 shift
获取位置参数的第一个元素。一样的。
使用子例程参数的典型方式是:
my($hashref, $arrayref) = @_;
完全修复,您的代码应如下所示。 diagnostics
pragma 将为您提供更广泛的错误解释。
use strict;
use warnings;
use diagnostics;
sub PassArrRef{
my @array = (0,1,2,3,4);
my %hash = (0,'a',1,'b',2,'c');
ReceiveHashRef(\%hash, \@array)
}
sub ReceiveHashRef{
my($hashref, $arrayref) = @_;
print "hash ref: $hashref, array ref: $arrayref\n";
}
PassArrRef();
并充分利用 https://perldoc.perl.org/!