Thread Verständnisfrage Datentypen (Array/Hash/literale "Listen")
(29 answers)
Opened by tschloss at 2008-11-29 13:20
Irgendwie kommen mir die Darstellungen hier etwas verdreht vor.
tschloss+2008-11-29 12:20:26-- Werd ich mir gleich mal durchlesen, ich antworte trotzdem schonmal. Quote Arrays und Hashes werden nicht genau gleich gespeichert. Hashes werden so gespeichert, dass man effizient auf bestimmte Schluessel zugreifen kann. Wenn man Arrays oder Hashes initialisiert, geschieht dies in der Regel in beiden Fällen über eine Liste. Ebenso kann man ein Array oder einen Hash im Listenkontext benutzen, dann bekommt man wieder dieselben Werte, mit denen man es initialisiert hat. Das ein Array aber zwischendurch anders gespeichert wird als ein Hash, merkt man schon daran, dass die obengenannte Liste beim Hash die Reihenfolge ändern kann. Die erwähnte "Effizienz" beim Speichern eines Hashes geht natürlich verloren, wenn man die Werte wieder zu einer Liste verwandelt. Code: (dl
)
1 my @array = (1,2,3,4); Quote Das passiert auch nur, weil die Daten von der Form, in der sie gespeichert sind, in eine flache Liste verwandelt werden und wieder zurück. Code: (dl
)
@array = %hash; # Hash wird zur Liste gemacht, damit wird dann das Array initialisiert Quote Ja, da (wie oben erwähnt) ein Hash ganz anders gespeichert wird als ein Array, wird auch ein Flag mitgespeichert, was es ist. Bei Variablen (%hash vs @array) merkt man ja eh schon am Sigil (bzw Symboltabellen-Slot-Dings), welcher Variablentyp es ist, aber bei Referenzen merkt man, dass perl auch sonst weiß, was was ist: Code: (dl
)
1 my $ref = []; # array-referenz Quote Eben darum wird ein Hash komplett anders gespeichert als ein Array. lichtkind+2008-11-29 13:28:44-- In Perl 5 gibt es auch einen Unterschied zwischen Array und Liste. Ein Array bezeichnet eine bekannte "Speicherstelle", also eine Variable oder eine Referenz. Liste ist zum einen ein Kontext, zum anderen tritt es überall auf, wo mehrere Werte umhergeschoben werden. Was eine Subroutine zurückgibt, ist zum Beispiel eine Liste. (Edit: Ich wollte mit diesem Absatz genau das sagen, was auch pq geschrieben hat, während ich getippt habe.) Den Unterschied merkt man immer wieder auf subtile Weise: Code: (dl
)
1 sub foo { Lieblingsmodule: IPC::System::Simple, Path::Class
|