我应该返回引用还是哈希?

时间:2011-04-08 12:42:57

标签: perl hash reference

  

可能重复:
  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

2 个答案:

答案 0 :(得分:1)

如果返回%HoA,则返回哈希值,因此会复制哈希并占用额外的内存。如果你通过引用返回它,它将不会被复制,因此它在性能和内存方面更好。

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

答案 1 :(得分:1)

当提供散列为普通散列时,需要复制所有元素。对于非常大的哈希,这可能是性能问题。提供hashref时,仅复制引用。这通常更快。

此外,您可能会从中获得改进代码的灵感:

#!/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;