2016-07-26 22 views

Antwort

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; 

Verwenden .clone und deepmap eine Kopie/tiefe Kopie einer Datenstruktur zu beantragen. Aber wette nicht darauf. Jedes Objekt kann es auf clone Methode definieren und tun, was es will. Wenn Sie mutieren müssen und daher klonen müssen, stellen Sie sicher, dass Sie Ihr Programm mit großen Datensätzen testen. Schlechte Algorithmen können ein Programm in der Produktion praktisch nutzlos machen.

+0

Es könnte schön sein * show * wie 'deepmap' mit Klon – Borodin

+0

zu verwenden Die Bindung sollte nicht benötigt werden. Da scheint irgendwo ein Käfer zu sein. –

+1

ENOBUG. Deepmap in Verbindung mit Klon wird tun, wie gefragt. siehe: http://irclog.perlgeek.de/perl6/2016-07-26#i_12912861 –

2

Die schmutzige Art und Weise:

#!/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; 

, die Sie gibt:

$ 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}}} 

Wenn Sie eval Eingabe von einer externen Quelle, immer daran denken, es zuerst zu prüfen. Wie auch immer, die Verwendung von EVAL ist gefährlich und sollte vermieden werden.