Schrift
[thread]534[/thread]

Unverständliche Typenzuweisung: Skriptanalyse (Seite 2)



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
esskar
 2005-07-22 15:12
#5323 #5323
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
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.

Code: (dl )
1
2
3
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.
Code: (dl )
$x->{foo} = 'bar';
, 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
Code: (dl )
my $w = $q->Vars
auswirken.)

Code: (dl )
1
2
3
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;
Code: (dl )
1
2
my $v;
%$v = %{$q->Vars};

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!
angelsfall
 2005-07-22 15:25
#5324 #5324
User since
2005-07-06
6 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=esskar,22.07.2005, 13:12]Verstanden?[/quote]
Yes, Sir!

Also macht man praktisch neuen Hash erstellen und eine Referenz darauf ansetzen in einem Zug (ist also keine Dereferenzierung). Wäre jetzt interessant zu wissen, wie der Hash dann heisst. $v ist ja die Referenz, ist %v dann der Hash oder ist er einfach anonym (oder die Standardvariable (%_))?

/edit: Achso, vielen Dank für deine ausführliche Erklärung!\n\n

<!--EDIT|angelsfall|1122031986-->
Taulmarill
 2005-07-22 15:32
#5325 #5325
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wenn man $v direkt bei der initialisierung die werte übergeben will, kann man das mit my $v = { %{$q->Vars} }; machen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-07-22 12:52.