Fra*_*ank 14 perl reference function pass-by-reference
我经常在Perl中有一个子程序,用一些信息填充数组.由于我也习惯于使用C++进行攻击,我发现自己经常在Perl中这样做,使用引用:
my @array;
getInfo(\@array);
sub getInfo {
my ($arrayRef) = @_;
push @$arrayRef, "obama";
# ...
}
Run Code Online (Sandbox Code Playgroud)
而不是更简单的版本:
my @array = getInfo();
sub getInfo {
my @array;
push @array, "obama";
# ...
return @array;
}
Run Code Online (Sandbox Code Playgroud)
当然,原因是我不希望在子例程中本地创建数组,然后在返回时复制.
是对的吗?或者Perl是否优化了它?
use*_*400 18
那么首先返回一个数组引用呢?
sub getInfo {
my $array_ref = [];
push @$array_ref, 'foo';
# ...
return $array_ref;
}
my $a_ref = getInfo();
# or if you want the array expanded
my @array = @{getInfo()};
Run Code Online (Sandbox Code Playgroud)
根据德曼的评论编辑:
也可以在函数中使用普通数组并返回对它的引用.
sub getInfo {
my @array;
push @array, 'foo';
# ...
return \@array;
}
Run Code Online (Sandbox Code Playgroud)
Leo*_*ans 13
传递引用更有效,但差异并不像C++那么大.参数值本身(表示:数组中的值)总是通过引用传递(尽管复制了返回的值).
问题是:这有关系吗?大多数时候,它没有.如果您要返回5个元素,请不要理会它.如果您要返回/传递100'000个元素,请使用引用.只有在瓶颈的情况下才对其进行优化.
如果我看一下你的例子并考虑你想做什么,我习惯用这种方式写它:
sub getInfo {
my @array;
push @array, 'obama';
# ...
return \@array;
}
Run Code Online (Sandbox Code Playgroud)
当我需要返回大量数据时,在我看来这是一个简单的版本.您在第一个代码段中编写时不需要在外部分配数组sub,因为my这样做是为了您.反正你不应该做过早的优化,莱昂TIMMERMANS 建议.
回答最后的思考,不,Perl 并没有对此进行优化。事实上,它不能,因为返回数组和返回标量是根本不同的。
如果您正在处理大量数据或者性能是主要考虑因素,那么您的 C 习惯将对您很有帮助 - 传递和返回对数据结构的引用而不是结构本身,这样就不需要复制它们。但是,正如 Leon Timmermans 指出的那样,绝大多数时候,您处理的数据量较小,而且性能并不是什么大问题,因此请以最易读的方式进行操作。