Wie kann ich eine Perl-Subroutine erstellen, die mehr als einen Block akzeptiert?

8

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%     
Flimm 20.11.2014, 16:44
quelle

5 Antworten

9

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.

%Vor%

Ausgabe

%Vor%     
Borodin 20.11.2014, 17:16
quelle
1

Haben Sie versucht, ein Komma zwischen die beiden Blöcke zu setzen?

%Vor%

Ich habe mich geirrt ...

Aber das funktioniert für mich:

%Vor%     
Len Jaffe 20.11.2014 17:03
quelle
1

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

    
Vorsprung 20.11.2014 16:56
quelle
0

Sie könnten nur eval die Blöcke

%Vor%

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:

%Vor%

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:

%Vor%

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?

    
G. Cito 20.11.2014 19:00
quelle
0

Fwiw, in Perl 6:

%Vor%

Aber sehen Sie meine teilweise Liste mit Vorbehalten zu Perl 6 .

    
raiph 27.11.2014 03:18
quelle

Tags und Links