Q: DESTROY funktioniert nicht

Q: DESTROY funktioniert nicht

am 22.06.2006 17:17:57 von Ferry Bolhar

Hallo,

ich habe folgenden Code (ist nicht auf meinem Mist gewachsen, aber
ich verstehe, was er tun soll; zumindest hoffe ich es ;-):

sub spaeter (&) {
bless shift, "Spaeter";
}

sub Spaeter::DESTROY {
$_[0]->();
}

print "Beginn";
{
print "Blockbeginn\n";
my $test = spaeter {print "Blockende!\n"};
print "Im Block\n";
}
print "Ende";

Ich erhalte

Beginn
Blockbeginn
Im Block
Ende

dh., das "Blockende" wird nicht ausgegeben.

Die Überlegung ist folgende: Die Subroutine "spaeter" erwartet eine
Codereferenz und bindet diese an die Klasse "Spaeter". Sie returniert
die gebundene Referenz, die innerhalb eines Blocks einer lexikalischen
Variable $test zugewiesen wird. Das heißt, $test ist ein Objekt, das an
die Klasse "Spaeter" gebunden ist.

Per Defiintion ruft Perl für Objekte die DESTROY Methode auf, wenn
für die Objektklasse eine solche definiert ist und das Objekt verschwindet,
wie es bei lexikalischen Variablen der Fall ist, wenn der sie umschließende
Block endet, dh., in diesem Beispiel nach der print "Im Block" Anweisung.

Der DESTROY-Methode wird als (erstes) Argument das im Verschwinden
begriffene Objekt übergeben, das hier eine Codereferenz ist und daher wird
mit $_[0]->() der Code, auf den die Referenz zeigt, ausgeführt. Sprich, es
sollte vor den eigentlichen Ende noch "Blockende" ausgegeben werden.

Das passiert aber eben nicht. Es kommt auch kein Fehler, obwohl der
Code - selbstverständlich - mit "use warnings/use strict" kompiliert wird.

Das Beispiel stammt wie gesagt nicht von mir, sondern aus einen Buch
(ich verrate aber jetzt nicht, welches!), und so würde ich erwarten, dass
es so funktioniert, wie es dort beschrieben ist und wie ich es hier kurz
geschildert habe. Dem ist aber nicht so.

Wer weiß, warum nicht?

Schöne Grüße aus Wien

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: Q: DESTROY funktioniert nicht

am 22.06.2006 18:04:36 von Frank Seitz

Ferry Bolhar wrote:

[Destruktor eines Code-Objekts wird nicht gerufen]

> Wer weiß, warum nicht?

Schon erstaunlich, was Du alles an Kuriositäten aufspürst.

Ich vermute, es liegt daran, dass Programmcode
niemals freigegeben wird. Der Destruktor eines Objekts wird ja
nicht gerufen, wenn eine Referenz auf das Objekt
aus dem Scope geht, sondern wenn das referenzierte Objekt
nicht mehr benötigt wird.

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

Re: Q: DESTROY funktioniert nicht

am 22.06.2006 20:16:57 von Daniel Fischer

Frank Seitz!

> Ich vermute, es liegt daran, dass Programmcode
> niemals freigegeben wird. Der Destruktor eines Objekts wird ja
> nicht gerufen, wenn eine Referenz auf das Objekt
> aus dem Scope geht, sondern wenn das referenzierte Objekt
> nicht mehr benötigt wird.

So sehe ich das auch. Mit der folgenden Aenderung funktioniert es. Die
Zeile

my $test = spaeter {print "Blockende!\n"};

wird ersetzt durch diese beiden:

sub blubb {print "Blockende!\n"}
my $test = spaeter \&blubb;


Gruss
Daniel

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 06:59:42 von Joerg Plate

> sub spaeter (&)
Prototypen sind boese :)

> my $test = spaeter {print "Blockende!\n"};
'spaeter' bekommt hier *keine* Codereferenz.

1> perl -MData::Dumper -le 'print Dumper({print "Hallo"})'
Hallo
$VAR1 = {
'1' => undef
};


"Blockende" wird auch an der 'richtigen' Stelle ausgegeben.

1> cat spaeter1.pl
use strict;
use warnings;

sub spaeter { bless shift, "Spaeter"; }

sub Spaeter::DESTROY { $_[0]->(); }

print "Beginn\n";
{
print "Blockbeginn\n";
my $test = spaeter {print "Blockende!\n"};
print "Im Block\n";
}
print "Ende\n";

1> perl spaeter1.pl
Beginn
Blockbeginn
Blockende!
Odd number of elements in anonymous hash at testing1.pl line 16.
Im Block
(in cleanup) Not a CODE reference at testing1.pl line 10.
Ende


SEE ALSO perltidy(1) perlcritic(1) perlstyle(1) Perl::Tidy(3) :)

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 09:36:47 von Frank Seitz

Joerg Plate wrote:
>>sub spaeter (&)
>
> Prototypen sind boese :)

Nein.

>>my $test = spaeter {print "Blockende!\n"};
>
> 'spaeter' bekommt hier *keine* Codereferenz.

Mit obigem Prototyp schon.

> 1> perl spaeter1.pl
> Beginn
> Blockbeginn
> Blockende!
> Odd number of elements in anonymous hash at testing1.pl line 16.
> Im Block
> (in cleanup) Not a CODE reference at testing1.pl line 10.
> Ende

Da Du den Prototyp weggenommen hast, hast Du den
Code kaputtgemacht.

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

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 09:43:06 von Frank Seitz

Daniel Fischer wrote:
> Frank Seitz!
>>
>>Ich vermute, es liegt daran, dass Programmcode
>>niemals freigegeben wird. Der Destruktor eines Objekts wird ja
>>nicht gerufen, wenn eine Referenz auf das Objekt
>>aus dem Scope geht, sondern wenn das referenzierte Objekt
>>nicht mehr benötigt wird.
>
> So sehe ich das auch. Mit der folgenden Aenderung funktioniert es. Die
> Zeile
>
> my $test = spaeter {print "Blockende!\n"};
>
> wird ersetzt durch diese beiden:
>
> sub blubb {print "Blockende!\n"}
> my $test = spaeter \&blubb;

Hm, dann ist meine Erklärung, dass es damit zusammenhängt,
dass Programmcode vom Interpreter nicht freigegeben wird,
wohl doch nicht zutreffend. Denn da sehe ich keinen Unterschied.

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

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 11:32:54 von Daniel Fischer

Frank Seitz!

> Hm, dann ist meine Erklärung, dass es damit zusammenhängt,
> dass Programmcode vom Interpreter nicht freigegeben wird,
> wohl doch nicht zutreffend. Denn da sehe ich keinen Unterschied.

Die sub existiert auch über das Blockende raus, perl kann keine lokalen
Subs. Offenbar wird aber die Referenz darauf freigegeben (der Destruktor
wird ja aufgerufen). So ganz blicke ich da aber auch nicht durch.


Gruss
Daniel

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 11:40:40 von Ferry Bolhar

Joerg Plate:

>> sub spaeter (&)
> Prototypen sind boese :)

Warum?

>> my $test = spaeter {print "Blockende!\n"};
> 'spaeter' bekommt hier *keine* Codereferenz.

Doch.

> 1> perl -MData::Dumper -le 'print Dumper({print "Hallo"})'
> Hallo
> $VAR1 = {
> '1' => undef
> };

Ja, weil es in diesem Code eben keine Prototype Deklaration gibt.

Schau dir an, was Deparse für diese Zeile meines Beispiels ausgibt
(_mit_ der Prototype-Deklaration):

$test = spaeter(sub{
print "Blockende!\n";
});

Ich denke also doch, das 'spaeter' hier eine Codereferenz übergeben
bekommt, wenngleich das nicht sofort ersichtlich ist. Das ist ja gerade
der Grund für das von dir als "böse" bezeichnete Prototyping - es
veranlasst den Compiler, das '{print ...}' als Codereferenz zu inter-
pretieren, und nicht als Referenz auf ein anonymes Hash mit nur einem
Element.

> "Blockende" wird auch an der 'richtigen' Stelle ausgegeben.

Nein, es wird zu früh ausgegeben. Es müsste zuerst "Im Block", danach
erst "Blockende" kommen. Wie du in deinem Beispiel weiter unten ja
selbst zeigst, kommt zuerst das "Blockende", dann "Im Block". Das heißt,
das verzögerte Ausführen von Code, der innerhalb eines Blocks definiert
wird, aber erst unmittelbar vor dem Verlassen des Blocks ablaufen soll
(was ja der Sinn der Beispiels ist), funktioniert nicht.

Und das liegt, wie du ja selbst oben zeigst, daran, dass Perl ohne
Prototyping
das '{print...}' nicht als Codereferenz erkennt, sondern als Hashreferenz,
die
an 'spaeter()' übergeben wird. Und um den Hash auszuwerten, wird der
print Befehl ausgeführt (daher wird "Blockende" vor "Im Block" ausgegben)
und der Rückgabewert von print (hier 1) wird als Hashelement verwendet.
Das Ergebnis ist ein anonymer Hash mit nur einem Element, dessen Key "1"
und dessen Wert "undef" ist.

Aber mit Prototyping wird tatsächlich, wie gewünscht, eine Codereferenz
übergeben, weil das '(&)' eben eine Codereferent erzwingt.

> 1> perl spaeter1.pl
> Beginn
> Blockbeginn
> Blockende!
> Odd number of elements in anonymous hash at testing1.pl line 16.
> Im Block
> (in cleanup) Not a CODE reference at testing1.pl line 10.
> Ende

Siehe oben."Blockende" müsste _nach_ "Im Block" ausgegeben werden.

> SEE ALSO perltidy(1) perlcritic(1) perlstyle(1) Perl::Tidy(3) :)

perltidy, perlcritic und Perl::Tidy gibt es auf meinen Systemen nicht. Und
perlstyle beantwortet nicht meine Frage, warum das gezeigte Beispiel
(mit Prototyping) nicht so wie erwartet funktioniert.

LG, Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 11:57:49 von Ferry Bolhar

Frank Seitz:

> Schon erstaunlich, was Du alles an Kuriositäten aufspürst.

Ja, ich gebe zu, es sind nicht gerade alltägliche Sachen. Aber
gerade deswegen bemühe ich, sie dennoch zu verstehen.

> Ich vermute, es liegt daran, dass Programmcode
> niemals freigegeben wird. Der Destruktor eines Objekts wird ja
> nicht gerufen, wenn eine Referenz auf das Objekt
> aus dem Scope geht, sondern wenn das referenzierte Objekt
> nicht mehr benötigt wird.

Und das ist per Definition der Fall, wenn die letzte Bindung zu
ihm entfernt wird. In diesem Fall wird das Objekt einer lexi-
kalischen Variable zugewiesen, die beim Ende des Blockes
wieder verschwindet. Es gibt aber sonst keine weitere Bindung
zu dem Objekt und somit sollte seine DESTROY-Methode
aufgerufen werden. Aber genau das passiert eben nicht.
Warum?

LG, Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 12:04:41 von Ferry Bolhar

Daniel Fischer:

> my $test = spaeter {print "Blockende!\n"};
>
> wird ersetzt durch diese beiden:
>
> sub blubb {print "Blockende!\n"}
> my $test = spaeter \&blubb;

Das funktioniert aber auch nicht richtig. Jetzt wird zwar "Blockende"
ausgegeben, aber erst ganz zum Schluss, nach "Ende". Das kann man
sogar mit dem Debugger nachvollziehen - nach dem "Ende" kommt die

Debugged program terminated. Use q to quit or R to restart..

Meldung und der Debugger-Prompt. Gibt man danach "q"
ein, wird tatsächlich "Blockende" ausgegeben.

Tja, somit stellt sich die Frage:

1) Was ist an deinem Code anders (außer, dass eine benannte und keine
anonyme Subroutine an 'spaeter()' übergeben wird)? Wieso wird in deinem
Code - wenn auch zu spät - die DESTROY-Methode aufgerufen und in
meinem gar nicht?

2) Wodurch ist das Objekt noch im Zugriff? Offensichtlich muss es noch
etwas anderes geben, dass darauf zugreift, sodass die DESTROY-Methode
erst im Rahmen des Script-Rundowns, wenn auch dieses "Unbekannte" das
Objekt freigibt, gestartet werden kann.

Schöne Grüße,

Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 12:51:39 von Daniel Fischer

Ferry Bolhar!

> Das funktioniert aber auch nicht richtig. Jetzt wird zwar "Blockende"
> ausgegeben, aber erst ganz zum Schluss, nach "Ende". Das kann man
> sogar mit dem Debugger nachvollziehen - nach dem "Ende" kommt die

Da hab ich offenbar nicht drauf geachtet, hmpf.

> 1) Was ist an deinem Code anders (außer, dass eine benannte und keine
> anonyme Subroutine an 'spaeter()' übergeben wird)?

Die sub ist nach Blockende nicht aus dem Scope raus. ("my sub" not yet
implemented etc.)

> Wieso wird in deinem Code - wenn auch zu spät - die DESTROY-Methode
> aufgerufen und in meinem gar nicht?

Das war eben die Theorie mit dem Codeblock, der nie zerstoert wird. Aber
die kann ich jetzt wohl auch in die Tonne treten...


Gruß
Daniel

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 14:17:48 von Ch Lamprecht

Ferry Bolhar schrieb:
> Hallo,
>
> ich habe folgenden Code (ist nicht auf meinem Mist gewachsen, aber
> ich verstehe, was er tun soll; zumindest hoffe ich es ;-):
>
> sub spaeter (&) {
> bless shift, "Spaeter";
> }
>
> sub Spaeter::DESTROY {
> $_[0]->();
> }
>
> print "Beginn";
> {
> print "Blockbeginn\n";
> my $test = spaeter {print "Blockende!\n"};
> print "Im Block\n";
> }
> print "Ende";
>
> Ich erhalte
>
> Beginn
> Blockbeginn
> Im Block
> Ende
>
> dh., das "Blockende" wird nicht ausgegeben.
>
> Die Überlegung ist folgende: Die Subroutine "spaeter" erwartet eine
> Codereferenz und bindet diese an die Klasse "Spaeter". Sie returniert
> die gebundene Referenz, die innerhalb eines Blocks einer lexikalischen
> Variable $test zugewiesen wird. Das heißt, $test ist ein Objekt, das an
> die Klasse "Spaeter" gebunden ist.
>
> Per Defiintion ruft Perl für Objekte die DESTROY Methode auf, wenn
> für die Objektklasse eine solche definiert ist und das Objekt verschwindet,
> wie es bei lexikalischen Variablen der Fall ist, wenn der sie umschließende
> Block endet, dh., in diesem Beispiel nach der print "Im Block" Anweisung.
>
> Der DESTROY-Methode wird als (erstes) Argument das im Verschwinden
> begriffene Objekt übergeben, das hier eine Codereferenz ist und daher wird
> mit $_[0]->() der Code, auf den die Referenz zeigt, ausgeführt. Sprich, es
> sollte vor den eigentlichen Ende noch "Blockende" ausgegeben werden.
>
> Das passiert aber eben nicht. Es kommt auch kein Fehler, obwohl der
> Code - selbstverständlich - mit "use warnings/use strict" kompiliert wird.

Hallo,

ich finde folgendes interessant: Wenn die anonyme sub in einem string-eval
erzeugt wird - also zur Laufzeit - , dann wird die Referenz am Blockende korrekt
abgebaut und der Destruktor aufgerufen. Siehe auch die unterschiedlichen
refcounts für die (inneren)CV Strukturen im Dump:

use strict;
use warnings;
use Devel::Peek;
sub spaeter {
bless shift, "Spaeter";
}

sub Spaeter::DESTROY {
$_[0]->();
print "in Destroy\n";
}

{
print "Blockbeginn\n";
my $test;
my $test2;
eval '$test = spaeter (sub{print "here I am! (test)\n"})';
$test2 = spaeter (sub{print "here I am!(test2)\n"});
print Dump $test;
print Dump $test2;
print "Im Block\n";

}

print "Ende";



Christoph
--

perl -e "print scalar reverse q/ed.enilno@ergn.l.hc/"

Re: Q: DESTROY funktioniert nicht

am 23.06.2006 18:12:10 von Ferry Bolhar

Christoph:

> ich finde folgendes interessant: Wenn die anonyme sub in einem string-eval
> erzeugt wird - also zur Laufzeit - , dann wird die Referenz am Blockende
korrekt
> abgebaut und der Destruktor aufgerufen. Siehe auch die unterschiedlichen
> refcounts für die (inneren)CV Strukturen im Dump:

Ja - beim zur Laufzeit erzeugten Objekt ist der Refcount 1 - daher klappts
mit
dem DESTROY - beim anderen ist er 2.

Aber das macht's eigentlich nur noch verwirrender:

1) Wieso ist er bei dem anderen 2? Wer oder was zeigt noch auf diesen CV?

2) Auch wenn der Refcount 2 ist, müsste doch spätestens beim Ende des
Skripts im Zuge des Rundowns trotzdem DESTROY aufgerufen werden.
Das passiert aber nicht. Warum?

Danke dennoch für deine Antwort, und schöne Grüße aus Wien,

Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: Q: DESTROY funktioniert nicht

am 27.06.2006 08:39:19 von Christian Winter

Ferry Bolhar schrieb:
> Christoph:
>
>> ich finde folgendes interessant: Wenn die anonyme sub in einem string-eval
>> erzeugt wird - also zur Laufzeit - , dann wird die Referenz am Blockende
> korrekt
>> abgebaut und der Destruktor aufgerufen. Siehe auch die unterschiedlichen
>> refcounts für die (inneren)CV Strukturen im Dump:
>
> Ja - beim zur Laufzeit erzeugten Objekt ist der Refcount 1 - daher klappts
> mit
> dem DESTROY - beim anderen ist er 2.
>
> Aber das macht's eigentlich nur noch verwirrender:
>
> 1) Wieso ist er bei dem anderen 2? Wer oder was zeigt noch auf diesen CV?
>
> 2) Auch wenn der Refcount 2 ist, müsste doch spätestens beim Ende des
> Skripts im Zuge des Rundowns trotzdem DESTROY aufgerufen werden.
> Das passiert aber nicht. Warum?

Wie es aussieht ist das Flag WEAKOUTSIDE dafür verantwortlich, ob
DESTROY aufgerufen wird oder nicht. Nur wenn es nicht gesetzt ist
(wie z.B. im eval-Beispiel, wo Perl nicht früh genug erkennen kann,
ob eine echte Closure vorliegt) wird das Objekt ordnungsgemäß zer-
stört. Das selbe passiert, wenn explizit eine Referenz zur anon-Sub
übergeben wird, denn dann ist noch eine Struct ohne WEAKOUTSIDE
zwischen Objekt-SV und Code-PVCV.

Ich habe aber jetzt schon zum Xten mal das ganze verglichen und
die Anmerkung in perlintern dazu gelesen, ohne dass mir schlüssig
klar wäre, warum das Objekt in den anderen Fällen nicht sauber
zerstört wird.

-Christian

Re: Q: DESTROY funktioniert nicht

am 17.07.2006 16:40:15 von Arne Ruhnau

Hi NG, nochmal eine Nachfrage zur Thematik nicht-zerstörter Coderefs:

Christian Winter wrote:
> Ferry Bolhar schrieb:
>
>> Christoph:
>>
>>> ich finde folgendes interessant: Wenn die anonyme sub in einem
>>> string-eval erzeugt wird - also zur Laufzeit - , dann wird die Referenz am Blockende
>>> korrekt abgebaut und der Destruktor aufgerufen. Siehe auch die unterschiedlichen
>>> refcounts für die (inneren)CV Strukturen im Dump:
>>
>> Ja - beim zur Laufzeit erzeugten Objekt ist der Refcount 1 - daher klappts
>> mit dem DESTROY - beim anderen ist er 2.
>>
>> Aber das macht's eigentlich nur noch verwirrender:
>>
>> 1) Wieso ist er bei dem anderen 2? Wer oder was zeigt noch auf diesen CV?
>>
>> 2) Auch wenn der Refcount 2 ist, müsste doch spätestens beim Ende des
>> Skripts im Zuge des Rundowns trotzdem DESTROY aufgerufen werden.
>> Das passiert aber nicht. Warum?
>
> Wie es aussieht ist das Flag WEAKOUTSIDE dafür verantwortlich, ob
> DESTROY aufgerufen wird oder nicht. Nur wenn es nicht gesetzt ist
> (wie z.B. im eval-Beispiel, wo Perl nicht früh genug erkennen kann,
> ob eine echte Closure vorliegt) wird das Objekt ordnungsgemäß zer-
> stört. Das selbe passiert, wenn explizit eine Referenz zur anon-Sub
> übergeben wird, denn dann ist noch eine Struct ohne WEAKOUTSIDE
> zwischen Objekt-SV und Code-PVCV.

Blöde Nachfrage, aber: wenn eine Closure das einzige Element ist, dass
noch ein Objekt referenziert, und diese Closure dann nicht ordentlich
collected wird, dann hat man doch ein enorm übles Speicherleck, ohne
es verhindern zu können, oder?
Ein "Ja" würde ein Problem von mir zumindest erklären, wo ich Closures
exzessiv verwende, um Graphensuchen/Backtracking zu beschreiben. Dank
herausgekapseltem Zustand eines Objekts konnte ich zumindest
verhindern, dass immer mein gesamter Arbeitsspeicher + Swap
aufgefressen wurde, aber rein strukturell sollte der footprint des
Programms einen quasi konstanten Wert haben (wegen der konstanten
Rekursionstiefe der Graphensuche)

Naja, ist das denn schon als Bugreport raus?

Arne Ruhnau

Re: Q: DESTROY funktioniert nicht

am 20.07.2006 16:26:39 von Ferry Bolhar

Arne Ruhnau:

> Naja, ist das denn schon als Bugreport raus?

Nein, weil - zumindest mir - nicht klar ist, ob das wirklich ein Bug ist.
Es steht dir frei, dich an deswegen an die p5p Group zu wenden,
wenn du dich davon betroffen fühlst.

Übrigens: für die, die in c.l.p.m nicht mitlesen: ich habe das Problem
auch dort gepostet, und zwar keine Erklärung, aber einen Workaround
angeboten bekommen:

sub spater (&) {
bless [shift],"Spaeter";
}

sub Spaeter::DESTROY {
$_[0]->[0]->();
}

Hier wird die Codereferenz nochmals mit einer Arrayreferenz
gekapselt (es ging auch mit einer Skalar- oder Hashreferenz), und
schon geht's! Warum, bleibt allerdings offen.

Es scheint, dass Perl für Objekte, die auf Codereferenzen basieren,
keine DESTROY-Methode aufruft bzw. diese möglicherweise gar
nicht als Objekte im üblichen Sinn interpretiert. In der Perl-Doku
ist auch tatsächlich immer nur von Skalar-, Array- und Hash-
Referenzen, die für Objekte verwenden werden können, die Rede,
nie von Codereferenzen. Allerdings ist dort auch nicht angeführt,
dass man mit Codereferenzen keine Objekte basteln kann.

Scheint sich also um eine Art Definitionsvakuum zu handeln...

Ich werden dieses Verhalten jedenfalls in künftigen Perl-Versionen
testen und sehen, ob sich etwas geändert hat. Falls ja, werde ich
hier wieder darüber berichten.

LG, Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at