【问题标题】:In Perl, how can I return a tied hash from a subroutine?在 Perl 中,如何从子例程返回绑定的哈希?
【发布时间】:2010-10-28 23:24:59
【问题描述】:

我想要一个 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_hash 实际上会被绑定,还是会将 %myhash 解压缩到一个列表中,然后从该列表中创建一个新的(普通的、无序的)哈希?如果我不能以这种方式返回一个绑定的哈希,我可以返回一个引用吗?也就是说,我可以通过让 make_ordered_hash 返回\%myhash 来解决它吗?

【问题讨论】:

    标签: perl return-type


    【解决方案1】:

    没有。执行此操作时返回的是哈希内容的副本,并且该副本未绑定,正如您在第二段中所推测的那样。

    你也是正确的,为了达到你的结果,你需要返回一个对绑定哈希的引用: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
    

    【讨论】:

    • 绑定与否,无论如何都建议返回大数据结构的参考(副本可能很昂贵)。
    • @Thilo - 是的,虽然有时你想要一个副本,例如当您将数据传递到多个不能保证保持不变的地方时。例如。将在某些算法中用作堆栈的列表。复制速度当然是一个有效的考虑因素,只要记住它需要在完整的上下文中查看;)
    • 同意。但在这种情况下,原始副本将超出范围并被垃圾收集。还有一种情况是,您将数据传递到多个地方并希望查看它们所做的更改。
    • 这里我不是特别在意效率。我只是在命令行参数处理中使用它。另外,无论如何,绑定变量不是很慢吗?
    • “另外,绑定变量不是很慢吗?” - 正确...我认为 Thilo 和我都在讨论通过值/引用独立地返回哈希值,至少我是 :)
    猜你喜欢
    • 2014-07-02
    • 2013-11-20
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2013-04-30
    • 2011-02-01
    • 1970-01-01
    • 2017-04-07
    相关资源
    最近更新 更多