2013年3月4日月曜日

配列の参照を中身までコピーする

配列をコピーするには以下のように簡単に行えますが、
@foo = @bar;

配列の参照をコピーしたい場合は参照がコピーされるだけなので中身の値までコピーしてくれるわけではありません。


my @foo = ('A', 'B');
my @bar = \@foo; # 参照をコピーしても中身までコピーされるわけではない
@foo = (); # 参照元を初期化

foreach my $ref(@$bar) { # 参照元が初期化されているのでここでは何も出力されません
    print "$ref\n";
}


配列の参照を中身も含めてコピー(deep copy)したい場合は、foreach等を使って愚直に要素を1個ずつコピーするか、またはCloneモジュールを使います。


use Clone qw(clone);

my @foo = ('A', 'B');
my $bar = clone(\@foo); # 参照を中身までコピーする
@foo = (); # 参照元を初期化

foreach my $ref(@$bar) { # 参照元を初期化してもOK
    print "$ref\n";
}


結果は以下のようになります。


A
B



0 件のコメント:

コメントを投稿