![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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];
}
}
とすれば問題ないのですが、あまりスマートだと思えません。
もっとスマートにコピーする方法はありますか?
No.2ベストアンサー
- 回答日時:
元の$aが配列へのリファレンスなので、その$aを代入した$bも同じ配列へのリファレンスになるのは当然。
リファレンスのみをコピーする事をshallow copyと言い、実体までコピーするdeep copyとの違いを意識する必要があります。ここらへん、Perlに限らず、CやJavaでも出現する古典的な話題ですので、検索するといろいろ参考になるサイトが見つかると思います。
基本的に自分でコピーの処理を記述する必要がありますが、モジュールStorableのdcloneですますという手もあります。
詳しくはperldoc Storableをご覧下さい。
No.3
- 回答日時:
ベストかどうかは分かりませんが、
@b=map{[@{$_}]} @{$a}
くらいでしょうか。
@bと書いた通り、上のbは配列です。
bも参照の方が良いなら、適宜[~]等して下さい。
No.1
- 回答日時:
$Aと$Bが連動するのは、リファレンス(Cで言うポインタのようなもの)をコピーしているからです。
デリファレンス(実態参照)してコピーしないといけません。今手元にPerlが無いので確認できず申し訳ないのですが、
@$B = @$A で上手くいかないでしょうか。
http://72.14.235.104/search?q=cache:kabocha.org/ …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Visual Basic(VBA) 2つの条件が一致したら一覧へコピーしたい。 左から4番目以降のシート名にコードが入ったシートを全て、 5 2022/09/20 19:41
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2023/03/12 12:16
- Visual Basic(VBA) excelにて、特定の列に数字入力してあれば、入力してある行コピーして 別ファイルに張り付ける 2 2022/08/11 05:33
- Excel(エクセル) Excelで質問です! 現在マクロを勉強中の初心者です。 以下のような表から、会社名が空白のもの以外 2 2022/06/14 12:16
- Visual Basic(VBA) A列にある値をB列・C列にVBAで切り出し 3 2022/04/09 19:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラスに配列を渡す方法
-
チェックボックスのperlでの値...
-
マクロ Publicでの配列定義
-
perl 配列の要素数について
-
perl 初等プログラミングについて
-
二次元配列のインデックスについて
-
グループ分けの仕方について
-
MATLABの関数で配列の要素を返...
-
リストボックスに縦スクロール...
-
組み合わせについての質問です...
-
perlで2次元配列をサブルーチ...
-
Excel VBA ユーザーフォームの...
-
二次元配列における要素数のは...
-
VB6で配列の最大値を簡単に求め...
-
画面を強制的に再描画させる方法
-
VBのReturnの使い方
-
UWSCの終了の仕方
-
VBAでの一時停止と再開の方法
-
DoEventsが必要な理由について
-
乱数の桁数指定、または範囲指定。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dim flag(4) as boolean で配列...
-
VBAのautofilter、criteriaの配...
-
二次元配列のインデックスについて
-
二次元配列における要素数のは...
-
エクセルVBAでTransposeの不思議
-
クラスに配列を渡す方法
-
リストボックスに縦スクロール...
-
マクロ Publicでの配列定義
-
Excel VBA ユーザーフォームの...
-
文字の整列(printf)
-
perlで配列の要素が空なのを知...
-
perl 配列の要素数について
-
Strawberry Perl for Windows ...
-
VBA 二次元配列の1つ目を増...
-
チェックボックスのperlでの値...
-
perl 初等プログラミングについて
-
DBIを使ってSelect文 複数のカ...
-
複数のキーで配列をソートする...
-
Excel(VBA)で配列の要素数を...
-
newで個別に生成した配列にNULL...
おすすめ情報