2010-10-28 49 views
4

我想要一个perl子例程,它通过Tie :: IxHash模块创建并返回一个有序散列。它看起来是这样的:在Perl中,如何从子例程返回一个并列散列?

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来修复它吗?

回答

6

不可以。当你这样做的时候你返回的是散列内容的副本,并且这个副本不是绑定的,就像你在第二段中推测的一样。

你也是正确的,为了实现你造成的,你需要一个refernce返回到并列哈希来代替: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 
+1

捆绑或不是,无论如何,返回一个大数据结构的ref可能是可取的(副本可能是昂贵的)。 – Thilo 2010-10-28 23:36:40

+0

@Thilo - 确实,尽管有时候你想要一个副本,例如当你将数据传递到不能保证不变的多个地方时。例如。在某些算法中将用作堆栈的列表。复制速度当然是一个有效的考虑因素,请记住它需要在全文中查看;) – DVK 2010-10-28 23:42:22

+0

同意。但在这种情况下,原始副本将会超出范围并收集垃圾。而且,还有一种情况是您将数据传递给多个地方,并希望查看他们所做的更改。 – Thilo 2010-10-28 23:48:18

相关问题