簡體   English   中英

為什么在傳遞給子例程時對數組的引用會更改為 hash 引用

[英]Why does a reference to an array change to a hash reference when passed to a subroutine

我在嘗試修復的工具中遇到了這個問題,但不明白是什么導致數組引用更改為 hash 引用。 它僅在參數中的 hash ref 之后列出數組 ref 時發生,這讓我認為這是由於接收參數的方式所致。

我沒有該工具的代碼,但下面的代碼重新創建了正在發生的事情。

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();

此代碼輸出 Hash 參考。

這是因為在ReceiveHashRef中,您直接引用了第一個位置參數$_[0] ,然后在下一行調用shift ,它采用位置參數的第一個元素。 同樣的事情。

使用子例程 arguments 的典型方法是:

my($hashref, $arrayref) = @_;

完全修復,你的代碼應該是這樣的。 diagnostics雜注將為您提供更廣泛的錯誤解釋。

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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM