Mit Prototypen können Sie eine Subroutine erstellen, die als ersten Parameter einen Codeblock akzeptiert:
%Vor% Wie kann ich das Gleiche machen, aber mit mehr als einem Codeblock? Ich möchte Blöcke von Codes verwenden, nicht Variablen oder sub { ... }
.
Das funktioniert nicht:
%Vor%Es gibt diesen Fehler:
%Vor%Ich hoffe, Sie erkennen, dass dies nur Code Seasoning ist, und alles, was Sie erreichen, ist eine aufgeräumtere Syntax auf Kosten der Klarheit?
Perl erlaubt es Ihnen nicht, mehr als einen freien Block an eine Subroutine zu übergeben, aber der zweite tatsächliche Parameter könnte ein Aufruf einer Subroutine sein, die auch einen einzelnen Block akzeptiert und einfach die Codereferenz zurückgibt.
Dieses Programm demonstriert. Beachten Sie, dass ich please
und also
als Namen für die Subroutinen gewählt habe. Sie müssen jedoch etwas verwenden, das sowohl für die Funktionalität Ihres eigenen Codes geeignet ist als auch sehr unwahrscheinlich ist, dass es mit bevorstehenden Erweiterungen der Kernsprache kollidiert.
Ausgabe
%Vor%funktioniert für mich ...
%Vor%Nur für die Zwecke von TMTOWTDI ist hier eine Methode, die in gewisser Weise funktioniert, wie das OP angefordert
Machen Sie zuerst einen Quellfilter
%Vor%Zweitens muss der Filter verwendet werden
%Vor%ps. Das ist schrecklich und niemand würde dies in der Produktion sehen wollen
Sie könnten nur eval
die Blöcke
Ausgabe :
%Vor% Dann ignoriere einfach \&
und du bist da.
Ab v5.20
Sie können Signaturen und :prototype
Attribute zusammen verwenden. Das Feature signatures
bietet eine "häufigere" Syntax und eine minimalistische Art der Argumentprüfung. Vielleicht wird eines der Zukunftsperls ein "eingebautes" (optionales, hochflexibles) System irgendeiner Art dazu haben, aber Prototypen sind so etwas nicht. So etwas wie:
ist nicht, wie es scheint. Da Prototypen, signatures
und Signaturen mit :prototype(&&)
möglicherweise nicht das geben, was Sie denken, könnte dies gut genug sein:
Ausgabe :
%Vor% Um sicherzustellen, dass Perl nicht denkt, dass {}
ein Hash ist, ist &
notwendig. Aber eigentlich ... was ist falsch mit anonymen Subroutinen sub { }
hier zu verwenden?
Fwiw, in Perl 6:
%Vor%Aber sehen Sie meine teilweise Liste mit Vorbehalten zu Perl 6 .
Tags und Links perl function subroutine