从函数返回哈希的最佳Perl实践是什么?

Dan*_*ohn 14 perl hash reference

我正在考虑为函数传递返回数据的哈希引用的最佳实践.

一方面,将输入值仅传递给函数并且仅返回输出变量似乎是直观的.但是,在Perl中传递哈希只能通过引用来完成,因此它有点乱,并且似乎更容易出错.

另一种方法是在输入变量中传递引用,但是必须在函数中处理它,并且可能不清楚什么是输入以及什么是返回变量.

这是什么最佳做法?

返回对数组和散列的引用,然后取消引用它.

($ref_array,$ref_hash) = $this->getData('input');
@array = @{$ref_array};
%hash = %{$ref_hash};
Run Code Online (Sandbox Code Playgroud)

将引用(@array,%hash)传递给将保存输出数据的函数.

$this->getData('input', \@array, \%hash);
Run Code Online (Sandbox Code Playgroud)

jro*_*way 18

只需返回参考.没有必要像在示例中那样取消引用整个哈希:

my $result = some_function_that_returns_a_hashref;
say "Foo is ", $result->{foo};
say $_, " => ", $result->{$_} for keys %$result;
Run Code Online (Sandbox Code Playgroud)

等等

我从未见过有人传入空引用来保存结果.这是Perl,而不是C.


Cha*_*ens 10

试着通过说来创建副本

my %hash = %{$ref_hash};
Run Code Online (Sandbox Code Playgroud)

比使用hashref更危险.这是因为它只创建一个浅拷贝.这将使您认为可以修改哈希,但如果它包含引用,它们将修改原始数据结构.我觉得最好只传递引用并小心,但如果你真的想确保你有一份传入的引用,你可以说:

use Storable qw/dclone/;

my %hash = %{dclone $ref_hash};
Run Code Online (Sandbox Code Playgroud)


Igo*_*kon 5

第一个更好:

my ($ref_array,$ref_hash) = $this->getData('input');
Run Code Online (Sandbox Code Playgroud)

原因是:

  • 在第二种情况下,getData()需要检查数据结构以确保它们是空的
  • 你可以自由地将undef作为特殊值返回
  • 它看起来更像Perl-idiomatic.

注意:线条

@array = @{$ref_array};
%hash = %{$ref_hash};
Run Code Online (Sandbox Code Playgroud)

是有问题的,因为你在这里浅层复制整个数据结构.您可以在需要数组/散列的地方使用引用,为方便起见使用 - >运算符.