Pseudo-Hash Deklaration

14/01/2010 - 08:26 von Ferry Bolhar | Report spam
Hallo,

in einem (fremden!) Stück Code sah ich folgende Deklaration:

my MA::Map $map;

Ich weiß, dass das in früheren (vor Perl 5.8.8?) Versionen eine Deklaration
für ein Pseudo-Hash war, d.h., ein Ansprechen von

$map->{'Hallo'} = 1;

führt zu einem Austausch der Hashreferenz auf eine Arrayreferenz

$map->[2] = 1;

wenn es vorher (in einem BEGIN-Block angelegt) eine Hashvariable

%MA::Map::FIELDS = (Hallo => 2);

gab (d.h., jedem Key wird ein Indexwert zugeordnet und das Element
dann über diesen Index angesprochen):

Diese Pseudo-Hashes haben sich aber nie so recht bewàhrt und wurden
daher m.W. in 5.8.8 entfernt.

Jetzt wollte ich nur wissen, ob diese Deklaration noch eine andere
Bedeutung hat oder in neueren Perl-Versionen nur mehr ignoriert wird
(so sieht es zumindest aus). Ich habe sie schon testweise entfernt und
der Code làuft (scheinbar) unveràndert - aber der Teufel steckt
bekanntlich im Detail.

Weiß da jemand Bescheid?

LG, Ferry

Ing. Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: ferdinand.bolhar-nordenkampf@wien.gv.at
 

Lesen sie die antworten

#1 Peter J. Holzer
14/01/2010 - 10:39 | Warnen spam
On 2010-01-14 07:26, Ferry Bolhar wrote:
in einem (fremden!) Stück Code sah ich folgende Deklaration:

my MA::Map $map;

Ich weiß, dass das in früheren (vor Perl 5.8.8?) Versionen eine Deklaration
für ein Pseudo-Hash war,



Vor allem ist es eine Typ-Deklaration, d.h., Du erklàrt damit, dass
$map nur Objekte der Klasse MA::Map aufnehmen kann. Das erlaubt es dem
Compiler, bestimmte Checks und Optimierungen vorzunehmen.

d.h., ein Ansprechen von

$map->{'Hallo'} = 1;

führt zu einem Austausch der Hashreferenz auf eine Arrayreferenz

$map->[2] = 1;



Das war z.B. so eine Optimierung, aber die gibt es seit 5.10 nicht mehr.
Hauptsàchlich bleibt also die Möglichkeit der Compile-Time-Überprüfung.
Wenn Deine Klasse MA::Map (die "use fields" verwenden muss) also kein
Feld "Hallo" hat, bekommst Du schon beim Compilieren einen Fehler und
nicht erst zur Laufzeit.

hp

Ähnliche fragen