2015-02-18 13 views
5

Gibt es eine Konvention, um eine Liste der erforderlichen Parameter für eine Funktion anzufordern? Ich möchte in der Lage sein, eine Subroutine aufzurufen, die mir sagen würde, dass ich beim Aufruf von @repeat $ phrase und $ mal angeben muss.perl Liste der gewünschten Parameter

use strict; 
use warnings; 

sub repeat { 
    my $phrase = shift; 
    my $times = shift; 
    return $phrase x $times; 
    } 
+0

Ich denke, es war der seltsame Wortlaut Ihres ersten Satzes, der die Leute irreführte. Erst als Sie meine Antwort kommentiert haben, haben wir festgestellt, dass Sie tatsächlich eine Möglichkeit haben wollen, den Prototyp eines Unterprogramms zu bestimmen. Es ist eine seltsame Sache zu tun, wenn Sie eine IDE oder etwas ähnliches schreiben. Würden Sie Ihre Gründe dafür erklären, da es möglicherweise eine viel bessere Lösung gibt. Standard Perl 5 hat überhaupt keine Prototypen, also gibt es nichts zu holen. Es kann gut sein, dass Sie eine andere Sprache verwenden. – Borodin

+0

Danke, das ist gutes Feedback und ich entschuldige mich für schlecht formulierte Frage. Mein Anwendungsfall ist die dynamische Anzeige erforderlicher benannter Parameter auf einer Webseite, nachdem eine Funktion ausgewählt wurde. Die akzeptierte Antwort von Function :: Parameters ist genau das, wonach ich gesucht habe. – nando

Antwort

4

Sie scheinen nach Introspektion fragen. Es gibt viele OO-Frameworks, die es bereitstellen (z. B. Moose). Aber, wenn Sie in der Lage sein möchten, eine Funktion zu deklarieren und dann aus Ihrem Programm zu untersuchen, Function::Parameters ist ein vernünftiger Weg zu gehen.

Vom Function::Parameters::Info Synopsis:

use Function::Parameters; 

    fun foo($x, $y, :$hello, :$world = undef) {} 

    my $info = Function::Parameters::info \&foo; 
    my $p0 = $info->invocant;    # undef 
    my @p1 = $info->positional_required; # ('$x', '$y') 
    my @p2 = $info->positional_optional; #() 
    my @p3 = $info->named_required;  # ('$hello') 
    my @p4 = $info->named_optional;  # ('$world') 
    my $p5 = $info->slurpy;    # undef 
    my $min = $info->args_min; # 4 
    my $max = $info->args_max; # inf 

    my $invocant = Function::Parameters::info(method() { 42 })->invocant; # '$self' 

    my $slurpy = Function::Parameters::info(fun {})->slurpy; # '@_' 

Die Innerlichkeit Funktion im :: Info-Modul ist eigentlich mit Moosen umgesetzt.

+0

danke für den Zeiger. Ich werde das später versuchen. Zu Ihrer Information, ich habe "perl introspection" gesucht und keine großartigen Ergebnisse erhalten, aber ich habe genau das gefunden, was ich wollte (aber in der falschen Sprache) >>> def myfunc (arg1, arg2, arg3 = ' toto ', * args, ** kw): pass ... >>> importieren inspizieren >>> inspizieren.getargspec (myfunc) (['arg1', 'arg2', 'arg3'], 'args', 'kw', ('toto')) – nando

+0

Sie könnten auch auf Perl 6 warten, oder versuchen Sie es mit Schwerns [Perl 5i ] (http://search.cpan.org/~mschwern/perl5i-v2.13.1/). Perl 5 eignet sich einfach nicht für diese Art von OO-Techniken aus der Box - und das ist in Ordnung. –

6

Natürlich können Sie einige Kontrollmechanismen selbst aufbauen, je nach Ihren Bedürfnissen. Aber es gibt einige Module, die Ihnen bei Unterprogramm-Signaturen helfen. Ich werde drei von ihnen bieten:

  1. signatures, die einfachste
  2. Kavorka, mit Typ
  3. Method::Signatures für OO Methoden Überprüfung
+0

Das scheint mich näher zu bringen. Um zu klären, gibt es eine Möglichkeit, ein Sub zu inspizieren und eine Liste der gewünschten Parameter zurückzugeben? Signaturen und Parameter scheinen Möglichkeiten zu sein, mit Parametern umzugehen, die ich bereits zur Verfügung gestellt habe. Es sieht so aus, als ob Attribute :: Signature (die ich über Ihre Antwort gefunden habe) Ihnen erlaubt, "eine Signatur für Subroutinen zu definieren", was meiner Meinung nach genau das ist, wonach ich suche. – nando

+0

@Ben Grimm verwiesen [Funktion :: Parameter] (https://metacpan.org/pod/Function::Parameters) kann dann Lösung für die Inspektion sein? –

2

Meiner Meinung nach ist die beste Lösung für diese Frage ist zu Verwenden Sie Perl6::Parameters, die, wie der Name schon sagt, die Semantik von Perl 6 ohne den Schrecken der Verwendung eines Quellfilters emuliert.

+0

Das klingt vielversprechend. Wird etwas wie das Aufrufen von Prototyp (Funktion) geben mir die genannten Parameter zurück? Wenn ja, das beantwortet meine Frage. – nando

+0

Diese drei Module, die ich vorgeschlagen habe, verwenden auch keine Quellfilter, AFAIK. –

Verwandte Themen