5

I have a reference to an big array, and some of the elements (from some index to the end) need to get used to insert new rows in a DB.

Is there anyway I can create a reference to part of a bigger array? Or another way I can use a part of a array with DBI's execute_array function, without having Perl copy loads of data in the background?

Here's what I want to do more efficiently:

$sh->execute_array({}, [ @{$arrayref}[@indexes] ]);
4

3 回答 3

5

数组切片返回多个值并具有@标记:

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"

切片将返回一个标量列表(!= 一个数组)。但是,这本身不是副本:

my @array = (1, 2, 3, 4);

for (@array[1..2]) {
  s/\d/_/; # change the element of the array slice
}

print "@array"; # "1 _ _ 4"

所以这是非常有效的。

如果要创建新数组(或数组引用),则必须复制值:

my @array = (1, 2, 3, 4);

my @slice = @array[1..2];

my $slice = [ @array[1..2] ];

该语法\@array[1..2]将返回对切片中每个元素的引用列表,但不返回对切片的引用。

于 2013-03-01T15:28:31.220 回答
4
$sh->execute_array({}, [ @{$arrayref}[@indexes] ]);

类似于

sub new_array { my @a = @_; \@a }
$sh->execute_array({}, new_array( @{$arrayref}[@indexes] ));

请注意复制切片的所有元素的分配。我们可以避免复制标量,如下所示:

sub array_of_aliases { \@_ }
$sh->execute_array({}, array_of_aliases( @{$arrayref}[@indexes] ));

现在,我们只是复制指针 ( SV*) 而不是整个标量(以及其中的任何字符串)。

于 2013-03-01T16:20:33.263 回答
1

Perl 中的参数传递以“按引用传递”开始。如果您想知道是否制作了值副本,请查看源代码。

在这种情况下,execute_array的第二行的定义将引用的值复制@_到一个名为 的词汇@array_of_arrays中。

从好的方面来说,这是一个浅拷贝。(至少在我看来。)

于 2013-03-01T15:25:08.963 回答