我经常在Perl中有一个子程序,用一些信息填充数组.由于我也习惯于使用C++进行攻击,我发现自己经常在Perl中这样做,使用引用:
my @array; getInfo(\@array); sub getInfo { my ($arrayRef) = @_; push @$arrayRef, "obama"; # ... }
而不是更简单的版本:
my @array = getInfo(); sub getInfo { my @array; push @array, "obama"; # ... return @array; }
当然,原因是我不希望在子例程中本地创建数组,然后在返回时复制.
是对的吗?或者Perl是否优化了它?
那么首先返回一个数组引用呢?
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()};
根据德曼的评论编辑:
也可以在函数中使用普通数组并返回对它的引用.
sub getInfo { my @array; push @array, 'foo'; # ... return \@array; }
传递引用更有效,但差异并不像C++那么大.参数值本身(表示:数组中的值)总是通过引用传递(尽管复制了返回的值).
问题是:这有关系吗?大多数时候,它没有.如果您要返回5个元素,请不要理会它.如果您要返回/传递100'000个元素,请使用引用.只有在瓶颈的情况下才对其进行优化.
如果我看一下你的例子并考虑你想做什么,我习惯用这种方式写它:
sub getInfo { my @array; push @array, 'obama'; # ... return \@array; }
当我需要返回大量数据时,在我看来这是一个简单的版本.您在第一个代码段中编写时不需要在外部分配数组sub
,因为my
这样做是为了您.反正你不应该做过早的优化,莱昂TIMMERMANS 建议.