1 2 3 4 5 6 7 8 9 10
my $alt = { foo => 'bar', code => sub{ my ($t) = @_; say $t; }, }; require Storable; my $neu = Storable::dclone($alt); say $neu->{code}->('Hallo Welt');
2016-02-26T09:49:29 biancaBei clone sind aber auch nur "normale" Daten angegeben, keine Regexe und Codes.
QuoteThis module provides a clone() method which makes recursive copies of nested hash, array, scalar and reference types, including tied variables and objects.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#!/usr/bin/perl use strict; use warnings; use 5.010; my $alt = { foo => 'bar', code => sub{ say $_[0]; }, }; # kopieren use Clone 0.37; my $neu = Clone::clone($alt); # die Kopie ändern $neu->{code} = sub{ say "Und jetzt: ".$_[0]; }; $neu->{foo} = 'bar2'; $neu->{code}->('Hallo Welt neu'); # schauen ob das Original unverändert geblieben ist $alt->{code}->('Hallo Welt alt'); say $alt->{foo};
QuoteUnd jetzt: Hallo Welt alt
Hallo Welt neu
$eferenzkopie = $referenz;
Guest pq_unterwegses ging um deep copy...
1 2 3 4 5 6 7 8 9 10
my $alt = { foo => 'bar', code => sub{ my ($t) = @_; print $t; }, }; my $neu = $alt; $neu->{code}->('Hallo Welt');
1 2 3 4 5 6 7 8
my $alt = { code => sub{ printf "alt %s\n", shift } }; my $neu = $alt; $alt->{code} = sub { printf "neu %s\n", shift }; $neu->{code}->('Hallo Welt'); # "neu Hallo Welt"
1 2 3 4 5 6 7 8 9 10 11
use Clone "clone"; my $alt = { code => sub{ printf "alt %s\n", shift } }; # my $neu = $alt; my $neu = clone $alt; $alt->{code} = sub { printf "neu %s\n", shift }; $neu->{code}->('Hallo Welt'); # "alt Hallo Welt"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
use Clone 'clone'; my $alt = { array => [1,2], code => sub{ printf "alt %s\n", shift } }; my $neu = clone $alt; if ($neu->{array} eq $alt->{array}) { say "Das Array wurde nicht kopiert"; } else { say "Das Array wurde kopiert"; } if ($neu->{code} eq $alt->{code}) { say "Die Funktion wurde nicht kopiert"; } else { say "Die Funktion wurde kopiert"; }
2016-02-27T00:18:14 pqpack mal ein
$neu->{code} = sub { say "neu" };
nach das clone und guck, was sich ändert =)
interessanterweise wird das im unterschied zu arrays erst wirklich kopiert, wenns verändert wird. copy-on-write
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
use v5.10; use Clone 'clone'; my $alt = { array => [1,2], code => sub{state $i; return ++$i } }; my $neu = clone $alt; if ($neu->{array} eq $alt->{array}) { say "Das Array wurde nicht kopiert"; } else { say "Das Array wurde kopiert"; } if ($neu->{code} eq $alt->{code}) { say "Die Funktion wurde nicht kopiert"; } else { say "Die Funktion wurde kopiert"; } say "alt1: ".($alt->{code}->()); # alt1: 1 say "alt2: ".($alt->{code}->()); # alt2: 2 say "neu1: ".($neu->{code}->()); # neu1: 3 - state von "alt" wird weiter inkrementiert, weil es die gleiche Funktion ist say "neu2: ".($neu->{code}->()); # neu1: 4 $neu->{code} = sub{state $i; return ++$i }; say "neu1-neu: ".($neu->{code}->()); # neu1-neu: 1 - jetzt ist es eine neue state-Variable say "neu2-neu: ".($neu->{code}->()); # neu2-neu: 2 if ($neu->{code} eq $alt->{code}) { say "Die Funktion ist noch die gleiche"; } else { say "Die Funktion ist eine andere"; }
$coderef = sub {};
perldoc Clone
SEE ALSO
Storable's "dclone()" is a flexible solution for cloning variables, albeit slower for average-sized data structures. Simple and naive benchmarks show that Clone is faster for data structures with 3 or fewer levels, while "dclone()" can be faster for structures 4 or more levels deep.
perldoc StorableThere is a Clone module available on CPAN which implements deep cloning natively, i.e. without freezing to memory and thawing the result. It is aimed to replace Storable's dclone() some day. However, it does not currently support Storable hooks to redefine the way deep cloning is performed.