SvenB: dereferenzieren

Folgende Situation:

In einem Array (@refarray) befinden sich Referenzen auf weitere Arrays (@test1,@test2). Die Struktur dieses Arrays (also die Verwendung von Referenzen innerhalb des Arrays) lässt sich nicht vermeiden oder umgehen.

Nun muss ich einige Werte des Arrays für einen weiteren Schritt innerhalb einer Schleife modifizieren. Dabei soll das originale Array jedoch nicht verändert werden sondern nur eine Kopie davon.
Schliesslich möchte ich bei jedem Schleifendurchlauf wieder die selbe Ausgangssituation haben.

Leider modifiziere ich jedoch mit jeder Änderung der Kopie gleichzeitig das Original so dass ich die ursprünglichen Daten verliere. Mich würde nun interessieren wie ich eine vollständig abgekoppelte "Arbeitskopie" des ursprünglichen Arrays erstellen kann.

Da das alles etwas verwirrend ist , habe ich ein kleines Beispielscript geschrieben :

#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use Data::Dumper;
print "Content-Type: text/plain\n\n";

@test1 = ("wert11","wert12");
@test2 = ("wert21","wert22");
@refarray = (@test1,@test2);

print "Original-Array vorher:\n";
print Dumper(@refarray);

for($a=1 ; $a<=2 ; $a++){
 my @testarray = @refarray;
 print "Durchgang $a:\n";
 for($i=0 ; $i<@testarray ; $i++){
  push(@{$testarray[$i]},"add".$a.$i);
 };
 print Dumper(@testarray)."\n\n";
};

print "Original-Array nachher:\n";
print Dumper(@refarray);
############################################################

schaut man sich die Ausgabe an, so stellt man fest dass beim zweiten Durchgang auch die hinzugefügten Werte des ersten Durchgangs enthalten sind obwohl ich @refarray überhaupt nicht verändert habe.
my @testarray = @refarray;
Am Ende sieht man jedoch bei der Ausgabe "Original-Array nachher" dass @refarray die selben Änderungen erfahren hat wie @testarray

Ich würde mich freuen wenn jemand einen guten Rat für mich hätte.

  1. 你好 SvenB,

    Leider modifiziere ich jedoch mit jeder Änderung der Kopie gleichzeitig das Original so dass ich die ursprünglichen Daten verliere. Mich würde nun interessieren wie ich eine vollständig abgekoppelte "Arbeitskopie" des ursprünglichen Arrays erstellen kann.

    Was du da machst, ist eine sogenannte "shallow copy", eine flache Kopie: du kopierst zwar die Elemente des Arrays, aber nicht die Referenzen. Was du möchtest, ist eine "deep copy", eine tiefe Kopie: du möchtest auch Kopien der Referenzen. Das kannst du entweder per Hand machen, oder du nutzt das Modul Storable dafür:

      
    use Data::Dumper;  
    use Storable qw(dclone);  
      
    @test1 = ("wert11","wert12");  
    @test2 = ("wert21","wert22");  
    @refarray = (\@test1,\@test2);  
      
    print "Original-Array vorher:\n";  
    print Dumper(\@refarray);  
      
    for($a=1 ; $a<=2 ; $a++){  
      my @testarray = @{dclone(\@refarray)};  
      print "Durchgang $a:\n";  
      
      for($i=0 ; $i<@testarray ; $i++){  
        push(@{$testarray[$i]},"add".$a.$i);  
      }  
      
      print Dumper(\@testarray)."\n\n";  
    }  
    
    

    再见,
     克里斯蒂安

    --
    Bauer sucht Frau! | Ich bin ja eigentlich kein Serien-Junkie…
    Nur die Weisesten und die Dümmsten können sich nicht ändern.
    http://wwwtech.de/
    1. Was du da machst, ist eine sogenannte "shallow copy", eine flache Kopie: du kopierst zwar die Elemente des Arrays, aber nicht die Referenzen. Was du möchtest, ist eine "deep copy", eine tiefe Kopie: du möchtest auch Kopien der Referenzen. Das kannst du entweder per Hand machen, oder du nutzt das Modul Storable dafür:

      ich danke dir Christian - das war exakt das was ich suchte und funktioniert auch in meiner wesentlich komplexeren Struktur.