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

Posted

技术标签:

【中文标题】在 Perl 中,如何从子例程返回绑定的哈希?【英文标题】:In Perl, how can I return a tied hash from a subroutine? 【发布时间】: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 来解决它吗?

【问题讨论】:

【参考方案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 和我都在讨论通过值/引用独立地返回哈希值,至少我是 :)

以上是关于在 Perl 中,如何从子例程返回绑定的哈希?的主要内容,如果未能解决你的问题,请参考以下文章

返回哈希的子例程 - 将其分解为单独的变量

perl返回哈希和的键和值

从 perl 数组/哈希打印信息

如何修改这个 Perl 子例程,以便它使用 print_file 打印文件的内容?

perl中如何判断一个hash是不是为空

如何从子查询中返回两个字段