Überprüfen Sie, ob eine Unterroutine in Perl als Lvalue oder als Rvalue verwendet wird

8

Ich schreibe einen Code, in dem ich eine Subroutine als lvalue und als rvalue benutze, um Datenbankwerte zu lesen und zu schreiben. Das Problem ist, ich möchte, dass es anders reagiert, je nachdem, ob es als L-Wert oder als R-Wert verwendet wird.

Ich möchte, dass das Unterprogramm in die Datenbank schreibt, wenn es als lvalue verwendet wird, und aus der Datenbank liest, wenn es als rvalue verwendet wird.

Beispiel:

%Vor%

Das einzige, was mir einfällt, ist, einen Weg zu finden, wie das Unterprogramm erkennt, ob es als L-Wert oder als R-Wert verwendet wird und auf jeden Fall anders reagiert.

Gibt es eine Möglichkeit, dies zu tun?

    
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 von eigenständigen Unterprogrammen 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.
tjwrona1992 03.02.2016, 17:40
quelle

3 Antworten

4

Die Entscheidung, wie man sich verhält, ob als lvalue aufgerufen wurde oder nicht, ist eine schlechte Idee, da foo(record_name(...)) es als lvalue bezeichnen würde.

Stattdessen sollten Sie entscheiden, wie Sie sich verhalten sollen, ob verwendet ist oder nicht.

Sie können das tun, indem Sie einen magischen Wert zurückgeben.

%Vor%

Ein kleiner Test:

%Vor%

Ausgabe:

%Vor%

Nachdem Sie das gesehen haben, haben Sie sicherlich gelernt, dass Sie die Idee, ein Lvalue-Sub zu verwenden, aufgeben sollten. Es ist möglich, all diese Komplexität zu verbergen (zum Beispiel mit sentinel ), aber die Komplexität bleibt bestehen. Die Auffassungsgabe ist nicht die ganze Komplexität wert. Verwenden Sie separate Setter und Getter oder verwenden Sie einen Accessor, dessen Rolle auf der Anzahl der übergebenen Parameter basiert ( $s=acc(); vs acc($s) ).

    
ikegami 03.02.2016, 18:10
quelle
4

In diesem Fall möchten Sie vielleicht mein Sentinel -Modul ausprobieren.

Es stellt eine Funktion zur Verfügung, die Sie im Accessor verwenden können, um sie in einen mehr get / set Stil zu verwandeln. Z.B. Du könntest

%Vor%

An dieser Stelle sind die folgenden Codezeilenpaare äquivalent

%Vor%

Wenn Sie die spezifischen Methoden get_ und set_ der Methoden ebenfalls nicht angeben müssen, können Sie sie natürlich als Closures einfügen.

Weitere Informationen finden Sie in den Moduldokumenten.

    
LeoNerd 03.02.2016 17:59
quelle
0

Meiner Meinung nach waren lvalue Subroutinen in Perl eine dumme Idee. Unterstütze einfach ->record_name($subscript, $value) als Setter und ->record_name($subscript) als Getter.

Das heißt, Sie können das Want -Modul wie dieses verwenden

%Vor%

obwohl dies auch als LVALUE behandelt wird:

%Vor%

Wenn nur Zuordnungsanweisungen speziell behandelt werden sollen, verwenden Sie stattdessen want('ASSIGN') .

    
ysth 03.02.2016 17:57
quelle

Tags und Links