簡體   English   中英

如何在perl中通過引用傳遞哈希

[英]How to pass a hash by reference in perl

我知道這應該可以在谷歌上輕松搜索,更不用說perl的一個微不足道的使用,但我已經嘗試了很多解決方案,我發現它們到目前為止都沒有給出預期的行為。 本質上,我正在嘗試調用子例程,從該子例程返回對哈希的引用,將對該哈希的引用傳遞給另一個子例程,然后通過類似於以下的代碼打印該哈希的內容:

#!/usr/bin/perl                                                                                                                                                                                                   

my $foo = make_foo();

foreach $key (sort keys %$foo) {
    print "2 $key $$foo{$key}\n";
}

print_foo(\%foo);

sub print_foo
{
    my %loc = ???;
    foreach $key (sort keys %loc}) {
        print "3 $key $loc{$key}\n";
    }
}

sub make_foo
{
    my %ret;
    $ret{"a"} = "apple";
    foreach $key (sort keys %ret) {
        print "1 $key $ret{$key}\n";
    }
    return \%ret;
}

可以有人告訴我這樣做的最佳方式(通過子程序)而不創建哈希的額外副本嗎? 我試過的解決方案沒有打印出以“3”開頭的任何行。

您必須將參數作為參考拉出,然后取消引用它:

sub print_foo
{
    my ($loc) = @_;
    foreach my $key (sort keys %$loc) {
       print "3 $key $loc->{$key}\n";
    }
}

無論何時進行引用,都必須明確取消引用它。 另外,請注意對引用的任何更改都將更改原始內容。 如果您想避免更改原始內容,可以將哈希值作為列表傳遞:

print_foo(%foo); # flattens the hash to a list and passes it in through @_

sub print_foo
{
    my (%loc) = @_; # load the hash from the list
    foreach my $key (sort keys %loc) {
       print "3 $key $loc{$key}\n";
    }
}

或者將哈希引用復制到新哈希中:

sub print_foo
{
    my ($ref_loc) = @_; # changes to %$ref_loc will change %foo
    my %loc = %$ref_loc; # COPY, changes to %loc do not change %foo
    foreach my $key (sort keys %loc}) {
       print "3 $key $loc{$key}\n";
    }
}

其他一切都很好,所以我只專注於print_foo ......

sub print_foo
{
    my %loc = %{shift @_};
    foreach $key (sort keys %loc) {
        print "3 $key $loc{$key}\n";
    }
}

僅供參考,你需要意識到%loc現在是哈希的副本(我在這里問了一個問題解釋了這個問題: 關於在Perl中正確使用dereference的困惑 )。 為了避免復制......

sub print_foo
{
    my $loc = shift @_;
    foreach $key (sort keys %$loc) {
        my $val = $loc->{$key}
        print "3 $key $val\n";
    }
}

您希望將其從引用轉換為哈希,如下所示:

my %loc = %{@_[0]};

要么

my %loc = %{shift};

您也可以將其作為參考:

my $locref = shift;
foreach $key (sort keys %$locref}) {
    print "3 $key $locref->{$key}\n";
}

可以通過在命令行鍵入perldoc perlref到此信息。

暫無
暫無

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

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