Jon*_*hon 5 perl performance slice
我有一个大数组的引用,并且一些元素(从某个索引到结尾)需要习惯在DB中插入新行.
无论如何我可以创建一个更大数组的部分引用?或者另一种方法我可以使用DBI的execute_array函数的数组的一部分,而不在背景中使用Perl复制数据加载?
这是我想要更有效地做的事情:
$sh->execute_array({}, [ @{$arrayref}[@indexes] ]);
Run Code Online (Sandbox Code Playgroud)
数组切片返回多个值并具有@
sigil:
my @array = (1, 2, 3, 4);
print join " ", @array[1..2]; # "2 3"
my $aref = [1, 2, 3, 4];
print join " ", @{$aref}[1..3]; # "2 3 4"
Run Code Online (Sandbox Code Playgroud)
切片将返回标量列表(!=数组).但是,这本身并不是副本:
my @array = (1, 2, 3, 4);
for (@array[1..2]) {
s/\d/_/; # change the element of the array slice
}
print "@array"; # "1 _ _ 4"
Run Code Online (Sandbox Code Playgroud)
所以这非常有效.
如果要创建新数组(或数组引用),则必须复制值:
my @array = (1, 2, 3, 4);
my @slice = @array[1..2];
my $slice = [ @array[1..2] ];
Run Code Online (Sandbox Code Playgroud)
语法\@array[1..2]
将返回切片中每个元素的引用列表,但不返回对切片的引用.
$sh->execute_array({}, [ @{$arrayref}[@indexes] ]);
Run Code Online (Sandbox Code Playgroud)
类似于
sub new_array { my @a = @_; \@a }
$sh->execute_array({}, new_array( @{$arrayref}[@indexes] ));
Run Code Online (Sandbox Code Playgroud)
请注意复制切片所有元素的赋值。我们可以避免复制标量,如下所示:
sub array_of_aliases { \@_ }
$sh->execute_array({}, array_of_aliases( @{$arrayref}[@indexes] ));
Run Code Online (Sandbox Code Playgroud)
现在,我们只是复制指针 ( SV*
) 而不是整个标量(以及其中的任何字符串)。