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%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.)
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%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.)
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%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.)
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% 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:
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:
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.)
Tags und Links arguments perl shift subroutine undefined