電子書籍の厳選無料作品が豊富!

2次元配列のコピーについて質問があります。
$Aが元の2次元配列、$Bがコピー先だとして、
${$A}[0..N][0..N]に値が入っているとします。

ここで、$Bの代入を、$B=$Aとやってしまうと、$Aと$Bが連動してしまいます。
($Bが書き換わったのに$Aも書き換わる)

これはなぜなのでしょうか。
また、$Bの代入を、配列を走査して
foreach (0.. $#{$A})
{
 my ($i) = $_;
 foreach (0.. $#{${$A}[$i]})
 {
  my ($j) = $_;
  ${$B}[$i][$j] = ${$A}[$i][$j];
 }
}
とすれば問題ないのですが、あまりスマートだと思えません。
もっとスマートにコピーする方法はありますか?

A 回答 (3件)

元の$aが配列へのリファレンスなので、その$aを代入した$bも同じ配列へのリファレンスになるのは当然。


リファレンスのみをコピーする事をshallow copyと言い、実体までコピーするdeep copyとの違いを意識する必要があります。ここらへん、Perlに限らず、CやJavaでも出現する古典的な話題ですので、検索するといろいろ参考になるサイトが見つかると思います。

基本的に自分でコピーの処理を記述する必要がありますが、モジュールStorableのdcloneですますという手もあります。
詳しくはperldoc Storableをご覧下さい。
    • good
    • 0
この回答へのお礼

リファレンスを意識してませんでした^^;;
勉強し直します…

お礼日時:2007/01/24 12:00

ベストかどうかは分かりませんが、


 @b=map{[@{$_}]} @{$a}
くらいでしょうか。
@bと書いた通り、上のbは配列です。
bも参照の方が良いなら、適宜[~]等して下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。
mapとかgrepとかの使い方も勉強します…

お礼日時:2007/01/24 12:01

$Aと$Bが連動するのは、リファレンス(Cで言うポインタのようなもの)をコピーしているからです。

デリファレンス(実態参照)してコピーしないといけません。

今手元にPerlが無いので確認できず申し訳ないのですが、
@$B = @$A で上手くいかないでしょうか。

http://72.14.235.104/search?q=cache:kabocha.org/ …
    • good
    • 0
この回答へのお礼

ありがとうございます、ちょっと試してみます。

お礼日時:2007/01/24 11:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!