2016-07-26 30 views

回答

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

使用.clonedeepmap以請求一個數據結構的拷貝/深層副本。但不要打賭。任何對象都可以在clone方法中定義它,並且可以隨意做任何事情。如果您必須進行變異並因此必須進行克隆,請確保使用大型數據集測試程序。錯誤的算法會導致程序在生產中幾乎無用。

+0

這可能是很好的*顯示*如何使用'deepmap'克隆 – Borodin

+0

不應該需要綁定。有接縫成爲某處的錯誤。 – 2016-07-26 18:11:25

+1

ENOBUG。與clone一起使用的deepmap將按照要求進行操作。請參閱:http://irclog.perlgeek.de/perl6/2016-07-26#i_12912861 – 2016-07-26 18:43:46

2

骯髒的方式:

#!/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從外部源輸入,一定要記住先檢查一下。無論如何,使用EVAL是危險的,應該避免。