小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

Perlでの多次元配列の実体コピー

リファレンスのみをコピーする事をshallow copyと云い、実体までコピーする事をdeep copyと云います。
以下は、そのサンプルです。なにかの参考になれば、幸いです。

2次元deep copy

my $org_data_two_dimension = [["A01", "A02", "A03", "A04"],
                              ["B01", "B02", "B03", "B04"]];

        my $cpy_data_two_dimension = [map [@{$_}] , @$org_data_two_dimension];

        print $cpy_data_two_dimension->[0][0], "\n";
        print $cpy_data_two_dimension->[1][0], "\n";
        $cpy_data_two_dimension->[0][0] = "AAAAAAAAAAAA";
        $cpy_data_two_dimension->[1][0] = "BBBBBBBBBBBB";
        print $org_data_two_dimension->[0][0], "\n";
        print $org_data_two_dimension->[1][0], "\n";
        print $cpy_data_two_dimension->[0][0], "\n";
        print $cpy_data_two_dimension->[1][0], "\n";

3次元deep copy

my $org_data_three_dimension = [[["A01", "A02", "A03", "A04"],["C01", "C02", "C03", "C04"]],
                                [["B01", "B02", "B03", "B04"]]];
        
        my $cpy_data_three_dimension = [map [map [@{$_}], @{$_}] , @{$org_data_three_dimension}];

        print $cpy_data_three_dimension->[0][0][0], "\n";
        print $cpy_data_three_dimension->[1][0][0], "\n";
        $cpy_data_three_dimension->[0][0][0] = "AAAAAAAAAAAA";
        $cpy_data_three_dimension->[1][0][0] = "BBBBBBBBBBBB";
        print $org_data_three_dimension->[0][0][0], "\n";
        print $org_data_three_dimension->[1][0][0], "\n";
        print $cpy_data_three_dimension->[0][0][0], "\n";
        print $cpy_data_three_dimension->[1][0][0], "\n";
        print $cpy_data_three_dimension->[0][1][0], "\n";
        print $cpy_data_three_dimension->[0][1][1], "\n";