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

Perl 我应该返回引用还是散列?,perl,hash,reference,Perl,Hash,Reference,可能重复: 我有这个密码 my $h = function($ref); sub function { my $ref = shift @_; my %HoA = (); foreach my $key (keys %$ref) { $HoA{$key} = 1; } return \%HoA; } 它返回对%HoA的引用 在性能和内存使用方面,最好返回一个引用,还是我应该返回%HoA?如果返回%HoA,则按其值返回散列,因此

可能重复:

我有这个密码

my $h = function($ref);

sub function {
    my $ref = shift @_;

    my %HoA = ();

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

    return \%HoA;

}
它返回对
%HoA
的引用


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

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


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

当作为普通哈希提供哈希时,所有元素都需要复制。对于非常大的散列,这可能是一个性能问题。提供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;

顺便说一句,如果您执行所有这些操作以使哈希中有一个布尔值(
1
/
0
表示真/假):任何不是
0
undef
的其他值将计算为真。因此,实际上可能不需要获取所有值为1的哈希值。您的两行一行代码可以缩短为
my%new=map{$\u=>1}keys%$ref。谁对此投了反对票,但没有给出评论?为什么?这不是那么全面,但也不是完全错误。这不是同一个问题。哈希包含的冻结逻辑比数组多一点。如果你把它“倒”到一个接收散列中,它可能(我不太清楚)必须在另一端重新散列整个内容(尽管为了效率起见,它可能需要一个memcopy——Perler就是这样聪明)。因此,我可以说,从算法上讲,返回对集合哈希的引用比将其作为列表传递要简单。(重复引用数组。)