为什么在传递给子例程时对数组的引用会更改为散列引用

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/!