Search code examples
deep-copyraku

Does Perl 6 have a built-in tool to make a deep copy of a nested data structure?


Does Perl 6 have a built-in tool to make a deep copy of a nested data structure?

Added example:

my %hash_A = (
    a => {
        aa => [ 1, 2, 3, 4, 5 ],
        bb => { aaa => 1, bbb => 2 },
    },
);


my %hash_B = %hash_A;
#my %hash_B = %hash_A.clone; # same result

%hash_B<a><aa>[2] = 735;

say %hash_A<a><aa>[2]; # says "735" but would like get "3"

Solution

  • my %A = (
        a => {
            aa => [ 1, 2, 3, 4, 5 ],
            bb => { aaa => 1, bbb => 2 },
        },
    );
    
    my %B = %A.deepmap(-> $c is copy {$c}); # make sure we get a new container instead of cloning the value
    
    dd %A;
    dd %B;
    
    %B<a><aa>[2] = 735;
    
    dd %A;
    dd %B;
    

    Use .clone and .deepmap to request a copy/deep-copy of a data-structure. But don't bet on it. Any object can define its own .clone method and do whatever it wants with it. If you must mutate and therefore must clone, make sure you test your program with large datasets. Bad algorithms can render a program virtually useless in production use.