Unterstützt Perl benannte Parameter in Funktionsaufrufen?

8

Nach meiner Erfahrung mit Sprachen, die diese Funktion unterstützen, sind Programme, die Funktionen mit benannten Parametern und nicht mit Positionsparametern aufrufen, einfacher zu lesen und zu warten.

Ich denke, Perl hat dieses Feature, aber es funktioniert nicht für mich.

Ist es eine Eigenart des Pakets, das ich benutze, oder mache ich es falsch?

Einrichten des Funktionsaufrufs

Mein erstes Perl-Projekt besteht darin, das HTML :: TableExtract-Paket zu verwenden, um Tabellendaten aus HTML-Markup zu extrahieren und als Text anzuzeigen.

Der folgende Code richtet den Parser ein:

%Vor%

Die Dokumentation besagt, dass ich die Ausgabe an die Eingabeaufforderung mit der tables_dump -Methode und den Parametern $show_content und $col_sep verwenden, um das Ausgabeformat zu steuern:

  

tables_report([$show_content, $col_sep])

     

Gibt eine Zeichenfolge zurück, die extrahierte Tabellen zusammen mit ihrer Tiefe und Anzahl zusammenfasst. Optional wird ein $ show_content-Flag verwendet, das den extrahierten Inhalt jeder Tabelle auch mit Spalten ablegt, die durch $ col_sep getrennt sind. Standard $ col_sep ist ':'.

     

tables_dump([$show_content, $col_sep])

     

Wie tables_report (), außer dass die Informationen an STDOUT ausgegeben werden.

Aufruf mit positional und mit benannten Parametern

Wenn ich Positionsparameter in der Reihenfolge der Dokumentation übergebe, bekomme ich die erwartete Ausgabe:

%Vor%

Die Spalten sind durch einen Unterstrich anstelle des Standarddoppels getrennt:

%Vor%

Im Anschluss an Perls Advance Subroutines-Artikel habe ich versucht, einen Hash mit zu übergeben Parameternamen und Werte zur Verdeutlichung der Bedeutung der Parameter:

%Vor%

Perl versteht das nicht. Es ignoriert den Wert von col_sep und gibt den Standardwert aus:

%Vor%

Ich bekomme die gleiche Ausgabe, wenn ich nicht versuche, das Trennzeichen zu ändern:

%Vor%

Auch wenn ich Nonsense-Parameternamen festlege, bekomme ich die gleiche Ausgabe:

%Vor%

Kann ich diese Funktion unter Verwendung des benannten Parameter-Stils aufrufen, oder sollte ich mich nur für eine Position entscheiden?

    
Iain Elder 26.11.2012, 02:16
quelle

7 Antworten

4
  

Nach dem Advance Subroutines-Artikel von Perl.com habe ich versucht, eine   Hash enthält Parameternamen und Werte, um die Bedeutung von   die Parameter:

Dieser Artikel behandelt eine Möglichkeit, Unterroutinen so zu schreiben, dass sie eine Hash-Anweisung mit benannten Parametern akzeptieren. Wenn Sie ein Sub aufrufen, das nicht dafür geschrieben ist, dann wird es nicht richtig damit umgehen können.

%Vor%      

Perl versteht das nicht. Es ignoriert den Wert von col_sep und   Ausgaben mit dem Standardwert:

Nicht zu pedantisch, aber Perl versteht das gut. % Co_de% wird jedoch nur geschrieben, um eine Liste von Skalarparametern zu akzeptieren. Wenn Sie es so nennen, erhält es einen einzelnen skalaren Parameter. Dieser Parameter ist nur eine Referenz auf einen Hash, aber tables_dump weiß oder interessiert sich nicht dafür, also verwendet er den Verweis als Wert von tables_dump . Dies ist wahrscheinlich gleichbedeutend mit der Übergabe von $show_content für 1 , da sowohl show_content als auch jede mögliche Referenz im booleschen Kontext als "wahr" ausgewertet wird und ich angenommen habe, dass 1 immer nur als Boolescher Wert verwendet wird.

Da es keinen zweiten Parameter gibt, wird nichts $show_content zugewiesen, daher wird das Standardtrennzeichen verwendet, wie Sie beobachtet haben.

    
Dave Sherohman 26.11.2012, 15:11
quelle
11

Perl unterstützt native Parameter nicht nativ, es ist jedoch möglich, Funktionen zu entwerfen, die benannte Parameter akzeptieren (als Hash oder Hashref). Es hängt vom Autor der Funktion ab, wie sie es implementiert. Sie müssen Argumente liefern, die die Funktion erwartet, oder Sie erhalten unerwartete Ergebnisse.

    
Seganku 26.11.2012 02:30
quelle
6

Benannte Parameter, die in Perl übergeben werden (auch mit Standardwerten) werden sehr gut in Objektorientiert erklärt Perl , Kapitel 6. Dieser Stil ist sehr wichtig und wird häufig in Objektkonstruktoren verwendet. Deshalb wird es in ihrem OO Perl Buch erklärt.

Ich werde zwei ihrer Beispiele zitieren:

%Vor%

Ein anderes Beispiel, das eine andere Möglichkeit zur Definition von Standardwerten (in einem Hash) bietet, ist:

%Vor%     
Ahmed Nassar 09.08.2013 23:46
quelle
4

Perl hat keine integrierte Unterstützung für benannte Parameter. Wenn Sie sie verwenden möchten, muss die Funktion speziell geschrieben werden, um Argumente in diesem Stil zu akzeptieren. Also müssen Sie sich mit Positionsargumenten begnügen (oder schreiben Sie eine Wrapper-Funktion (wahrscheinlich in einer Unterklasse)).

    
melpomene 26.11.2012 02:21
quelle
3

Es ist nicht zu kompliziert. Sie übergeben das Schlüssel-Wert-Paar wie ein Hash oder als eine Hash-Referenz, und in der Subroutine laden Sie die Argumente in eine Hash- oder Hash-Referenz.

%Vor%

Mit einer anderen Zeile können Sie die genannten benannten Argumente in entsprechend benannte Variablen laden:

%Vor%     
mob 26.11.2012 04:41
quelle
0

Wenn Sie nur die Frage des Titels ausführen, können Sie Folgendes tun:

%Vor%     
solstice333 17.04.2017 21:19
quelle
-1

Hier ist ein einfaches Programm, das ich geschrieben habe, das eine Art von benannten Parametern verwenden kann. Es erlaubt Standardwerte.

%Vor%     
Chris Charley 26.11.2012 04:47
quelle

Tags und Links