在 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 中,如何从子例程返回绑定的哈希?的主要内容,如果未能解决你的问题,请参考以下文章