Perl: Prototyp in anonymer Subroutine

8

Ich lerne gerade über Perls System von Typeglobs und Namespaces. Also schrieb ich ein Modul, das zwei Argumente den Wert und den Namen einer Konstante nimmt und die Konstante an den Aufrufer exportiert. Die Variable $ package entspricht dem Aufrufer [2].

%Vor%

Mit dem obigen Code wird eine anonyme Unterroutine in die Aufrufersymboltabelle exportiert. Da mein Ziel ist, meine eigene Konstanten-Implementierung zu erstellen, hat die Subroutine einen leeren Prototyp, was bedeutet, dass es eine schreibgeschützte Unterroutine ist.

Aber das ist mein Problem: Der Prototyp funktioniert nicht. Also

%Vor%

Stimmt etwas in meinen Gedanken nicht? Gibt es einen anderen Weg, es zu tun?

    
user2875983 04.07.2014, 07:27
quelle

1 Antwort

10

Sie können während der Laufzeit alle gewünschten Symbole definieren, aber Prototypen wirken sich nur auf später kompilierten Code aus, da sich die Prototypen darauf auswirken, wie Aufrufe an das Subsystem analysiert und kompiliert werden. Zum Beispiel:

%Vor%

Wenn wir das ausführen, stirbt es mit:

  

Bareword "baz" nicht erlaubt, während "strict subs" in der tprot.pl Zeile verwendet wird   13.

Das ist ein kompilierter -Zeitfehler, verursacht durch strict : Der Compiler hat das Symbol% ​​co_de% gesehen und wusste nicht was es war, weil der typeglob baz erst geändert wird Laufzeit. Aber *Foo::baz funktionierte gut, weil es in einem bar -Block definiert wurde, der sofort beim Kompilieren ausgeführt wird.

IOW, weil Barcodes zweideutig sind, muss Perl zur Kompilierzeit wissen, ob es ein Sub oder etwas anderes ist. Sie können diese also während BEGIN installieren (die in einem impliziten import -Block ausgeführt wird), aber nicht zur Laufzeit.

Zusätzlich beeinflussen Prototypen die Kompilierungssemantik; Ein konstantes Unterprogramm (wie das von BEGIN ) wird wegoptimiert. Andere Prototypen veranlassen den Parser, sein Verhalten zu ändern (z. B. Subs, die Codeblöcke aufnehmen können). Der Compiler muss über all diese Dinge Bescheid wissen, bevor Aufrufe des Subs tatsächlich im Code auftreten, so dass sie korrekt analysiert werden können. Der Code wird ausgeführt, nachdem alles bereits analysiert wurde.

Das Aufrufen eines Unterworts mit expliziten Parens oder einem kaufmännischen Und-Zeichen hat diese Einschränkung nicht, da Perl zur Laufzeit intelligent genug ist, um zu wissen, dass es sich um Unterprogrammaufrufe handelt, und diese in der Symboltabelle dynamisch nachzuschlagen.

    
friedo 04.07.2014, 07:41
quelle