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)
第一个更好:
my ($ref_array,$ref_hash) = $this->getData('input');
Run Code Online (Sandbox Code Playgroud)
原因是:
注意:线条
@array = @{$ref_array};
%hash = %{$ref_hash};
Run Code Online (Sandbox Code Playgroud)
是有问题的,因为你在这里浅层复制整个数据结构.您可以在需要数组/散列的地方使用引用,为方便起见使用 - >运算符.