use CGI;
my $q = CGI->new;
my $v;
%$v = %{$q->Vars};
so funzt es.
Versuch der Erklärung:
$q->Vars gibt entweder eine HashReferenz oder einen Hash zurück; je nach Kontext. Eine Referenz kann man (grob) als Zeiger auf ein Stück im Arbeitsspeicher bezeichnen.
my $x = $q->Vars;
my $y = $q->Vars;
my $z = $x;
zeigen nun alle auf die selbe Stelle, heißt: änderst du einen Wert z.B.
, werden $y und $z auch "geändert", da sie in Wirklichkeiten nur die Speicheraddresse enthalten, an denen die Werte gespeichert sind, aber nicht die Werte selber; (die Änderungen von $x->{foo} würde sich z:b. nun auch auf eine neue Zuweisung
auswirken.)
my %x = %{$q->Vars};
my %y = %{$q->Vars};
my %z = %x;
Erstellt nun jeweils eine Kopie des Hashes, wodurch das Ändern von %x keine Auswirkungen mehr auf %y, %z haben kann.
So weit, so gut;
Was macht nun dieser Code?
Nun, es wird erstmal eine Variable angelegt!
Mit %$v (oder auch %{$v}) wird nun Perl erklärt, dass $v auf ein Stück Arbeitsspeicher zeigen soll, in dem ein Hash gespeichert werden soll; dieser Hash ist zu diesem Zeitpunkt noch leer. Durch die Zuweisung von %{$q->Vars}, wird dieses Stück Arbeitspeicher nun mit Daten gefüllt.
Danach zeigt $v immer noch auf diesen Speicher, der jetzt aber gefüllt und losgelöst von den Daten aus $q->Vars ist.
Verstanden?
PS: Es sei erwähnt, dass das ganze nur so ähnlich abläuft, aber es kommt der Idee doch schon sehr nah!