Perl 6 是否有内置工具来制作嵌套数据结构的深拷贝?

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

Perl 6 是否有内置工具来深度复制嵌套数据结构?

添加示例:

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"
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;

使用.clone.deepmap请求一个copy/deep-copy数据结构。但不要打赌。任何对象都可以定义自己的 .clone 方法并用它做任何想做的事。如果您必须变异并因此必须克隆,请确保您使用大型数据集测试您的程序。糟糕的算法会使程序在生产使用中几乎毫无用处。

肮脏的方式:

#!/usr/local/bin/perl6

use v6;
use MONKEY-SEE-NO-EVAL;

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


my %hash_B;
EVAL '%hash_B = (' ~ %hash_A.perl ~ ' )';

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

say %hash_A;
say %hash_B;

这给你:

$ perl6 test.p6
{a => {aa => [1 2 3 4 5], bb => {aaa => 1, bbb => 2}}}
{a => {aa => [1 2 735 4 5], bb => {aaa => 1, bbb => 2}}}

如果您评估来自外部源的输入,请始终记得先检查它。无论如何,使用 EVAL 是危险的,应该避免。