5

私は大きな配列への参照を持っており、いくつかの要素(いくつかのインデックスから最後まで)は、DBに新しい行を挿入するために使用する必要があります。

とにかく、より大きな配列の一部への参照を作成できますか?または、Perlがバックグラウンドでデータのロードをコピーすることなく、DBIのexecute_array関数で配列の一部を使用できる別の方法はありますか?

これが私がより効率的にやりたいことです:

$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でのパラメータの受け渡しは、「参照による受け渡し」として始まります。値のコピーが作成されているかどうかを知りたい場合は、ソースコードを参照してください。

この場合、の2行目の定義は、によって参照される値をという名前の字句にexecute_arrayコピーします。@_@array_of_arrays

明るい面では、それは浅いコピーです。(少なくとも私が見た限りでは。)

于 2013-03-01T15:25:08.963 に答える