Thread Verständnisfrage Datentypen (Array/Hash/literale "Listen") (29 answers)
Opened by tschloss at 2008-11-29 13:20

betterworld
 2008-11-29 17:44
#116714 #116714
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Irgendwie kommen mir die Darstellungen hier etwas verdreht vor.

tschloss+2008-11-29 12:20:26--
Hi, durch mein Problem vor ein paar Tagen und eure Antworten hat sich mein Verständnis bzgl. der komplexen Datentypen jetzt geändert.

Werd ich mir gleich mal durchlesen, ich antworte trotzdem schonmal.
Quote
1) Die Datentypen Array, Hash und literale Liste (zB "qw....") sind (intern) eigentlich immer Listen von Skalaren.

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
2
3
4
my @array = (1,2,3,4);
my %hash = (1,2,3,4);
print @array; # Benutze array im Listenkontext: Gibt dieselbe Liste, mit der ich es initialisiert habe
print %hash; # Gibt auch dieselbe Liste, aber die Reihenfolge kann anders sein: 3412

Quote
3) Zuweisungen auch zwischen verschiedenen Typen sind problemlos möglich (bei Hashes treten Elemente immer paarweise auf (interpretiert als key, value)). (Anmerkung: das könnte aber auch eine Intelligenz des Zuweisungsoperators sein, den Typ umzucasten)

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
1) Merkt Perl sich irgendwo einen Datentyp für Arrays/Hashes?

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
2
3
4
my $ref = []; # array-referenz
print $ref; # ARRAY(...)
$ref = {}; # Hash-Referenz
print $ref; # HASH(...)


Quote
3) Benötigt Perl nicht irgendwelche Metainfos zum effizienteren Zugriff auf eine Struktur, und zwar unterschiedliche für ein Array/eine Liste bzw. einen Hash?

Eben darum wird ein Hash komplett anders gespeichert als ein Array.

lichtkind+2008-11-29 13:28:44--
im gegensatz zu perl 6 kennt perl 5 keine unterscheidung von liste und array. qw ist nur eine kompakte schreibweise einen array zu erzeugen.

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
2
3
4
5
6
7
8
9
sub foo {
return "alpha", "beta";
}
my @array = ("alpha", "beta"); # Array wird mit Liste initialisiert

my $scalar = foo(); # Liste im skalaren Kontext: Ergibt das letzte Element
print $scalar; # "beta"
$scalar = @array; # Array im skalaren Kontext: Ergibt die Anzahl
print $scalar; # 2

View full thread Verständnisfrage Datentypen (Array/Hash/literale "Listen")