Autovivification bei for

05/03/2009 - 11:17 von Frank Seitz | Report spam
Hallo,

gegeben folgender Code:

my ($h,@a);
push @a,@$h;

Das produziert die Exception:
Can't use an undefined value as an ARRAY referenced
Leuchtet ein.

Wir modifizieren den Code:

my ($h,@a);
push @a,$_ for @$h;

Jetzt làuft es, Perl autovivifiziert nun offenbar.
Kann mir jemand den Unterschied erklàren?

Grüße
Frank
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
 

Lesen sie die antworten

#1 Ferry Bolhar
09/03/2009 - 12:06 | Warnen spam
"Frank Seitz":

Wir modifizieren den Code:

my ($h,@a);
push @a,$_ for @$h;

Jetzt làuft es, Perl autovivifiziert nun offenbar.
Kann mir jemand den Unterschied erklàren?



Ja. Im zweiten Fall erkennt der Parser, dass du eine
for (eigentlich foreach) Schleife verwendest und generiert
den padsv-Opcode (der den Wert von $h holt) mit dem Flag
OPpDEREF_AV. Das bewirkt zur Laufzeit, dass, soferne der
Skalar dann undefiniert ist, ein anonymes Array angelegt
und eine Referenz darauf im Skalar abgelegt wird, d.h.,
es làuft die von dir angesprochene Autovivification ab.

Anders gesagt: damit in der foreach Schleife das Aliasing
der Schleifenvariable funktioniert, muss das abzuarbeitende
Array existieren (auch wenn es leer ist). Das wird damit
sichergestellt.

Was mich dabei im Prinzip stört, ist, dass dann überhaupt
keine Meldung (auch keine Warnung) ausgegeben wird, denn
das Dereferenzieren eines nicht-existierenden Arrays deutet
IMHO doch auf zumindest unsauberen Programmstil hin.

LG, Ferry

Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail:

Ähnliche fragen