だるろぐ

だるいぶろぐです

シャローコピーとディープコピー

データをコピーするとき

  1. リファレンスをコピーするだけで参照先は同じ
    • コピーしたデータを変更するとコピー元も変更される
  2. 全く同じデータを複製する
    • コピーしたデータに何をしようとコピー元に影響は及ぼさない

の2通りがあってコードだと

use strict;
use warnings;
use Data::Dumper;sub p {warn Dumper @_;my @c = caller;print STDERR "  at $c[1]:$c[2]\n\n"}
use Storable qw/dclone/;

sub shallow {
    my $org = shift;
    my $cp = $org;
    $cp->{ho} = "_changed_";
}

sub deep {
    my $org = shift;
    my $cp = dclone($org);
    $cp->{ho} = "_changed_";
}

my %d = (qw/ho ge/);

deep(\%d);
p \%d;
shallow(\%d);
p \%d;
% perl t.pl
$VAR1 = {
          'ho' => 'ge'
        };
  at t.pl:22

$VAR1 = {
          'ho' => '_changed_'
        };
  at t.pl:24

てーのを何て言うんだっけと思ったら、前者がシャローコピー(shallow copy)またはサーフェイスコピー(surface copy)で後者がディープコピー(deep copy)だった。

http://books.google.co.jp/books?id=w4DmQjEWjZAC&pg=PA539&lpg=PA539#v=onepage&q&f=false


ググった限りはjava界隈の用語のようだ。