2013-03-01 9 views
5

大きな配列への参照があり、いくつかの要素(インデックスから末尾まで)は新しい行をDBに挿入する必要があります。Perl:新しい配列全体を作成せずに配列をスライスします。

もっと大きな配列の一部への参照を作成できますか? あるいは、DBIのexecute_array関数を使って配列の一部を使用することもできます。バックグラウンドでデータのPerlコピーをロードする必要はありませんか?

は、ここで私はより効率的に何をしたいです:Perlで

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

(ああ、argsは列のリストです。各列はその列の値の配列に対する参照です。) – ikegami

+3

Black Mageが私の鶏を攻撃するように見えます。うーん...揚げた鶏肉... – ikegami

+0

私は不思議に思っています。私は単に '$ arrayref + = $ index; $ sh-> execute_array({}、$ arrayref); ' この正確なコードはperlがCではないので動作しませんが、同じことを達成できないわけではありません。 – Jonathon

答えて

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*)をコピーしています。

+0

これはうまくいくはずです。 いくつかのテストを行うと、返される配列への参照は、最初の配列の同じ要素に対するものです(どちらか一方の要素を変更することで両方を変更できます)。 – Jonathon

+0

'sub {\ @_;} - >(@ {$ arrayref} [2..4]); ' – Jonathon

+1

コンパクトで多分、私は意図的にこれをやっていませんでした。それは、1)私が使ったことの自己文書化特性が欠けている、2)教えの状況で読むのが難しい、3) 'sub {my @a = @_; \ @ a} - >(...) 'は読みにくく、4)複数の場所で使っていると思いました。 PS、 ';'は役に立たない。 – ikegami

1

パラメータの受け渡しは、「参照渡し」としてスタートします。値のコピーが作成されているかどうかを知りたい場合は、ソースコードを参照してください。

この場合、execute_arrayの2行目の定義では、@_で参照される値が@array_of_arraysという名前のレキシカルにコピーされます。

明るい側は浅いコピーです。 (少なくとも私の知る限り見てきたよう)

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]は、スライス内の各要素への参照のリストを返しますが、参照ではないスライス。

関連する問題