Wie kann ich zwischen einem Argument, das nicht übergeben wurde, und einem Argument, das mit einem falschen Wert übergeben wurde, unterscheiden?

8

Ich versuche herauszufinden, wie man in Perl am besten differenziert, wenn ein Argument nicht übergeben wurde und ein Argument als 0 übergeben wurde, da sie für mich andere Bedeutungen haben.

(Normalerweise mag ich die Mehrdeutigkeit, aber in diesem Fall erzeuge ich SQL, also möchte ich undefinierte Argumente durch NULL ersetzen, aber 0 als 0 lassen.)

Das ist also die Zweideutigkeit:

%Vor%

Und bis jetzt ist das meine beste Lösung ... aber ich denke, es ist ein bisschen hässlich. Ich frage mich, ob du dir einen saubereren Weg vorstellen kannst oder ob dir das ok ist:

%Vor%     
Stephen 28.11.2011, 17:18
quelle

5 Antworten

16

Hier ist ein Beispiel, wie Sie alle möglichen Fälle behandeln können:

%Vor%

( @_ ist das Array von Argumenten für Ihre Funktion. Vergleichen Sie es mit 1 hier zählt die Anzahl der Elemente im Array. Ich vermeide absichtlich shift , da es @_ ändert, was würde erfordern, dass wir die ursprüngliche Größe von @_ irgendwo speichern.)

    
duskwuff 28.11.2011, 17:28
quelle
3
___ qstntxt ___

Ich versuche herauszufinden, wie man in Perl am besten differenziert, wenn ein Argument nicht übergeben wurde und ein Argument als 0 übergeben wurde, da sie für mich andere Bedeutungen haben.

(Normalerweise mag ich die Mehrdeutigkeit, aber in diesem Fall erzeuge ich SQL, also möchte ich undefinierte Argumente durch NULL ersetzen, aber 0 als 0 lassen.)

Das ist also die Zweideutigkeit:

%Vor%

Und bis jetzt ist das meine beste Lösung ... aber ich denke, es ist ein bisschen hässlich. Ich frage mich, ob du dir einen saubereren Weg vorstellen kannst oder ob dir das ok ist:

%Vor%     
___ answer8299783 ___

Hier ist ein Beispiel, wie Sie alle möglichen Fälle behandeln können:

%Vor%

( %code% ist das Array von Argumenten für Ihre Funktion. Vergleichen Sie es mit %code% hier zählt die Anzahl der Elemente im Array. Ich vermeide absichtlich %code% , da es %code% ändert, was würde erfordern, dass wir die ursprüngliche Größe von %code% irgendwo speichern.)

    
___ answer14588532 ___

Der einzige Weg, um sicher zu gehen, besteht darin, die Länge von %code% zu überprüfen, um zu sehen, ob es in diesem Slot ein Argument gab. Dies kann als etwas kompliziert angesehen werden, wenn es auch zwingende Argumente gibt, aber es muss nicht sein. Hier ist ein Muster, das in vielen Objektaccessoren verwendet wird:

%Vor%     
___ tag123perl ___ Perl ist eine prozedurale, allgemeine Programmiersprache für allgemeine Zwecke, die für ihre native Unterstützung von regulären Ausdrücken und String-Parsing-Funktionen bekannt ist. Bitte verwenden Sie diesen Tag für Fragen zu Perl im Allgemeinen. Für Dinge, die mit der neuen (aber verwandten) Sprache "Perl 6" zu tun haben, verwenden Sie bitte das perl6-Tag. Verwenden Sie für reguläre Ausdrücke nach Perl-Art in anderen Sprachen das Regex-Tag oder, falls sie auf der PCRE-Bibliothek basieren, das PCRE-Tag. ___ answer8299860 ___

Karte ist dein Freund. Versuchen Sie Folgendes:

%Vor%

Um ein wenig mehr Farbe hinzuzufügen, bin ich ein Fan davon geworden, einen Hash als Argumente für die Klarheit des Codes zu verwenden und die Wichtigkeit des Erinnerns an die Reihenfolge der Anordnung zu entfernen. So umgeschrieben würde es so aussehen:

%Vor%

(Aktualisiert: um 0 korrekt zu behandeln und dann erneut, um den Operator // zu verwenden.)

    
___ tag123arguments ___ Ein Argument ist ein Wert, der an eine Funktion, Prozedur oder ein Befehlszeilenprogramm übergeben wird. Dies bezieht sich auch auf das arrayähnliche 'arguments'-Objekt in JavaScript. ___ tag123shift ___ Fragen zur Verwendung der rechten und / oder linken Shift-Taste auf der Tastatur. Eine Unterroutine (z. B. eine Prozedur oder ein Unterprogramm) ist ein Teil des Codes innerhalb eines größeren Programms, der eine bestimmte Aufgabe ausführt und relativ unabhängig von dem verbleibenden Code sein kann. Die Syntax vieler Programmiersprachen umfasst die Unterstützung für das Erstellen eigenständiger Unterprogramme sowie für das Aufrufen und Zurückkehren von ihnen. Sie sind in vielerlei Hinsicht ähnlich wie Funktionen, haben aber normalerweise Nebenwirkungen außerhalb des einfachen "Rückgabewerts", der die Rückgabe bewirkt. ___ tag123undefined ___ Eine Variable ist nicht definiert, wenn ihr kein Wert zugewiesen wurde. ___ qstnhdr ___ Wie kann ich zwischen einem Argument, das nicht übergeben wurde, und einem Argument, das mit einem falschen Wert übergeben wurde, unterscheiden? ___ answer8300149 ___

persönlich Ich möchte %code% für NULLs beibehalten - es passt zu DBI-Platzhaltern / DBIx :: Class / SQL :: Abstract, das ist alles, und das Risiko, dass es die Zeichenkette %code% ist, besteht darin, dass Sie es versehentlich tun Fügen Sie den String statt %code% selbst ein.

Wenn Sie eine neuere Version von Perl (5.10 oder höher) verwenden, prüfen Sie die 'defined-or'-Operatoren %code% und %code% , die besonders praktisch für die Verarbeitung von Argumenten sind.

in Bezug auf die SQL, wenn Sie die SQL-Zeichenfolge generieren möchten, könnten Sie mit etwas wie folgt enden:

%Vor%

edit (um das Bit über NULL und undef zu beantworten):

Verwenden von DBI-Handles mit Platzhaltern:

%Vor%

DBIx :: Klasse

DBIx :: Class - das gleiche Prinzip - übergeben Sie einen undef-Wert, um ein %code% in der Datenbank:

%Vor%     
___
Egga Hartung 28.11.2011 17:27
quelle
1

persönlich Ich möchte undef für NULLs beibehalten - es passt zu DBI-Platzhaltern / DBIx :: Class / SQL :: Abstract, das ist alles, und das Risiko, dass es die Zeichenkette "NULL" ist, besteht darin, dass Sie es versehentlich tun Fügen Sie den String statt NULL selbst ein.

Wenn Sie eine neuere Version von Perl (5.10 oder höher) verwenden, prüfen Sie die 'defined-or'-Operatoren // und //= , die besonders praktisch für die Verarbeitung von Argumenten sind.

in Bezug auf die SQL, wenn Sie die SQL-Zeichenfolge generieren möchten, könnten Sie mit etwas wie folgt enden:

%Vor%

edit (um das Bit über NULL und undef zu beantworten):

Verwenden von DBI-Handles mit Platzhaltern:

%Vor%

DBIx :: Klasse

DBIx :: Class - das gleiche Prinzip - übergeben Sie einen undef-Wert, um ein NULL in der Datenbank:

%Vor%     
plusplus 28.11.2011 17:57
quelle
1

Der einzige Weg, um sicher zu gehen, besteht darin, die Länge von @_ zu überprüfen, um zu sehen, ob es in diesem Slot ein Argument gab. Dies kann als etwas kompliziert angesehen werden, wenn es auch zwingende Argumente gibt, aber es muss nicht sein. Hier ist ein Muster, das in vielen Objektaccessoren verwendet wird:

%Vor%     
darch 29.01.2013 17:20
quelle
0

Karte ist dein Freund. Versuchen Sie Folgendes:

%Vor%

Um ein wenig mehr Farbe hinzuzufügen, bin ich ein Fan davon geworden, einen Hash als Argumente für die Klarheit des Codes zu verwenden und die Wichtigkeit des Erinnerns an die Reihenfolge der Anordnung zu entfernen. So umgeschrieben würde es so aussehen:

%Vor%

(Aktualisiert: um 0 korrekt zu behandeln und dann erneut, um den Operator // zu verwenden.)

    
Patrick Collins 28.11.2011 17:33
quelle