ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

PerlでHashRefの入ったArrayRefを@$hogeでコピーした時に中のRefはどうなるねんみたいな話

# HashRefが要素になっているArrayRefを作る
my $milkyhomes = [
  { foo_id => 1, name => 'シャロ' },
  { foo_id => 2, name => 'ネロ' },
  { foo_id => 3, name => 'コーデリア' },
  { foo_id => 4, name => 'エリー' },
];
# なんかいじいじしたいからコピーする
my @g4 = @$milkyhomes;
# いじる
$g4[0]->{name} = '明智小衣';
# もともとのはどうなるねん
use DDP;
p $milkyhomes;
\ [
    [0] {
        foo_id   1,
        name     "明智小衣"
    },
    [1] {
        foo_id   2,
        name     "ネロ"
    },
    [2] {
        foo_id   3,
        name     "コーデリア"
    },
    [3] {
        foo_id   4,
        name     "エリー"
    }
]

まあそうですよね。。。外側だけコピーしても中身はアレや

追記

id:tokuhiromさんにStorable::dcloneっていうのがあるよってボソッと教えていただいたので、やってみました。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

use Storable qw/dclone/;

my $milkyhomes = [
  { foo_id => 1, name => 'シャロ' },
  { foo_id => 2, name => 'ネロ' },
  { foo_id => 3, name => 'コーデリア' },
  { foo_id => 4, name => 'エリー' },
];
# なんかいじいじしたいからコピーする
my $g4 = dclone $milkyhomes;
# いじる
$g4->[0]->{name} = '明智小衣';
# もともとのはどうなるねん
use DDP;
p $milkyhomes;
\ [    [0] {
        foo_id   1,
        name     "シャロ"
    },
    [1] {
        foo_id   2,
        name     "ネロ"
    },
    [2] {
        foo_id   3,
        name     "コーデリア"
    },
    [3] {
        foo_id   4,
        name     "エリー"
    }
]

ウェーイ!

Storable is core module!!!!