Die magische Symboltabelle oder: wie autovivication einen in den Wahnsinn treiben kann

Das die Symboltabelle, in der alle klassenspezifischen Dinge gespeichert werden, nur ein Hash ist war mir ja klar. Das allerdings auch dort autovivication für Methodenaufrufe gilt, nicht.

Folgendes ist passiert: ich habe per can() das vorhandensein einer Methode abgeprüft und musste mit Erschrecken feststellen, das ab diesem Moment der Eintrag ‘can’ in der Symboltabelle der Klasse vorhanden war. Das funktioniert nur mit Klassen, die in einer eigenen Datei liegen. Mit inline-Klassen geht es nicht. Nachvollziebar ist es mit folgendem Code:


use Data::Dumper();
my $handler_class = 'Data::Dumper';
my %before;
my %after;
@before{ keys(%{$handler_class . '::'}) } = (1) x scalar(keys(%{$handler_class . '::'}));
my $sub = $handler_class->can('notExisting');
eval("*$handler_class\::createdAtRuntime = sub { print 1 };");
@after{ keys(%{$handler_class . '::'}) } = (1) x scalar(keys(%{$handler_class . '::'}));
foreach my $key (keys(%after), keys(%before)) {
next if($after{$key} eq $before{$key});
print "$key: before($before{$key}) <> after ($after{$key}) : sub = “.*{$handler_class.’::’.$key}{CODE}.”\n”;
delete($after{$key});
delete($before{$key});
}

Der Wert der neuen Symboltabellen-Einträge ist leer. Immerhin etwas. Aber schräg ist es schon.

PS: Das war das erste mal, dass ich die komische Syntax zur Mehrfachzuweisung von Hash-keys halbwegs sinnvoll verwenden konnte. Das hat fast schon einen eigenen Eintrag verdient. Oder gibt es jemanden, der im obigen Codebeispiel die @before{… Zeile verständlich findet?

PPS @MKops: Perl rockt! 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert