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?
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.
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:
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?
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.
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.
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%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)).
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%Wenn Sie nur die Frage des Titels ausführen, können Sie Folgendes tun:
%Vor%Hier ist ein einfaches Programm, das ich geschrieben habe, das eine Art von benannten Parametern verwenden kann. Es erlaubt Standardwerte.
%Vor%Tags und Links perl named-parameters