我应该返回一个引用还是散列?

问题描述:

可能重复:
Is returning a whole array from a Perl subroutine inefficient?我应该返回一个引用还是散列?

我有此代码

my $h = function($ref); 

sub function { 
    my $ref = shift @_; 

    my %HoA =(); 

    foreach my $key (keys %$ref) { 
     $HoA{$key} = 1; 
    } 

    return \%HoA; 

} 

它返回到%HoA的参考。

在性能和内存使用方面,最好是返回一个参考还是我应该return %HoA

+1

这是*不*同样的问题。散列比数组包含更多的冻结*逻辑*。如果你将它“倒入”到一个接收散列中,它可能(我不知道那些胆子是那么好)必须在另一端重新整理所有东西(尽管它可以用于记忆效率 - )。所以关于最好的事情,我可以说它是算法上简单的返回一个引用组装散列比传递它作为一个列表。 (“重复”引用*数组*。) – Axeman 2011-04-08 16:30:34

如果您返回%HoA,您会按其值返回散列值,因此它将被复制并占用额外的内存。如果你通过引用返回它,它不会被复制,所以它在性能和内存方面更好。

顺便说一句,我想如果你返回%HoA,那么它将被垃圾回收器销毁,因为它不会有任何引用。

+0

谁没有给出评论而低估它为什么?这并不是那么全面,但并不严格不正确。 – 2011-04-08 13:12:01

将散列提供为纯散列时,需要复制所有元素。对于非常大的哈希值,这可能是一个性能问题。提供散列参考时,仅复制引用。这通常更快。

另外你可能会发现灵感,以改善这个代码:

#!/usr/bin/perl 

my $ref = { 
     foo => 23, 
     bar => 42, 
}; 

# do it with function 
sub hash_to_1 { 
     my $hash = shift; 

     my %result; 

     # list assignment like: (all hash elements) = ('1' as often as number of keys) 
     @result{keys %$hash} = (1) x keys %$hash; 

     return \%result; 
} 

# do it one line 
my %new; 
map { $new{$_} = 1} keys %$ref; 
+0

顺便说一句,如果你做了所有这些在哈希中有一个布尔值('1' /'0'表示真/假):任何其他值不是'0','undef'或'“”'将评估为真正。因此,实际上可能没有必要获得所有值为1的散列。 – 2011-04-08 12:59:13

+1

您的两行代码可以缩写为'my%new = map {$ _ => 1}键%$ ref;'。 – cHao 2011-04-09 13:31:41