代码之家  ›  专栏  ›  技术社区  ›  Ryan C. Thompson

在Perl中,如何从子例程返回绑定哈希?

  •  5
  • Ryan C. Thompson  · 技术社区  · 15 年前

    我希望有一个Perl子例程,它通过tie::iXhash模块创建并返回一个有序的哈希。看起来像这样:

    sub make_ordered_hash {
        my @hash_contents = munge_input(@_); # I get a list of alternating keys and values
        tie(my %myhash, Tie::IxHash, @hash_contents);
        return %myhash;
    }
    

    现在,如果我愿意 my %ordered_hash = make_ordered_hash(@input_stuff) ,是否将%ordered_哈希实际绑定,或者将%myhash解包到列表中,然后从该列表中创建一个新的(普通的、无序的)哈希?如果我不能以这种方式返回一个绑定哈希,我可以返回一个对它的引用吗?也就是说,我能不能把它修好,让它返回 \%myhash 相反?

    1 回复  |  直到 15 年前
        1
  •  6
  •   DVK    15 年前

    不,当你这样做的时候,你返回的是散列内容的一个副本,而这个副本并没有绑定,就像你在第二段中猜测的那样。

    您也正确,为了获得结果,您需要返回对绑定哈希的引用: return \%myhash;

    例子

    use Tie::IxHash;
    
    sub make_ordered_hash {
        my @hash_contents = (1,11,5,15,3,13);
        tie(my %myhash, Tie::IxHash, @hash_contents);
        return %myhash;
    }
    sub make_ordered_hashref {
        my @hash_contents = (1,11,5,15,3,13);
        tie(my %myhash, Tie::IxHash, @hash_contents);
        return \%myhash;
    }
    
    my @keys;
    
    my %hash1 = make_ordered_hash();
    @keys = keys %hash1;
    print "By Value = @keys\n";
    
    my $hash2 = make_ordered_hashref();
    @keys = keys %$hash2;
    print "By Reference = @keys\n";
    

    结果:

    By Value = 1 3 5
    By Reference = 1 5 3