Wie importiert man alle "unsere" Variablen aus dem unbenannten Perl-Modul, ohne sie aufzulisten?

9

Ich muss alle unsere Variablen aus dem unbenannten Perl-Modul (Module.pm) importieren und sie im Perl-Skript (Script.pl) verwenden.

>

Der folgende Code funktioniert gut ohne "use strict" , ist aber fehlgeschlagen. Wie kann ich diesen Code ändern, um mit "use strict" zu arbeiten, ohne die manuelle Auflistung aller importierten Variablen (wie in der Antwort auf andere Frage )?

Vielen Dank für Ihre Hilfe!

Script.pl:

%Vor%

Module.pm:

%Vor%

Führen Sie das Skript aus:

%Vor%

Fehler:

%Vor%

HINWEIS (1) : Das Modul ist unbenannt, daher ist die Verwendung eines Präfix Module:: nicht die Option.

HINWEIS (2) : Module.pm enthält auch eine Gruppe von Funktionen, die durch globale Variablen konfiguriert sind.

HINWEIS (3) : Variablen sind unterschiedlich und sollten NICHT in einem Array gespeichert werden.

HINWEIS (4) : Design ist NICHT gut, aber es geht nicht um das Design. Es geht darum, den aufgeführten Code zu zwingen, mit minimalen Änderungen mit der Komplexität O(1) zu arbeiten, d. H. Ein paar Zeilen Code, die nicht von N abhängen.

Lösungskandidat (ACCEPTED) : Fügen Sie $:: vor allen importierten Variablen hinzu. Es ist kompatibel mit strict und erlaubt auch, my Variablen von imported im Code zu unterscheiden.

    
aponomarenko 12.09.2011, 17:00
quelle

4 Antworten

7

Ändern Sie Ihr Skript in:

%Vor%

Das Problem ist, dass $Var1 nicht im Hauptnamensraum ist, sondern im Namensraum von Module .

Bearbeiten: Wie unten in den Kommentaren angegeben, haben Sie Ihr Modul nicht benannt (d. h. es steht oben nicht package Module; ). Aus diesem Grund gibt es keinen Module -Namespace. Ändern Sie Ihr Skript zu:

%Vor%

... erlaubt dem Skript, 1\n korrekt auszudrucken.

    
CanSpice 12.09.2011, 17:16
quelle
4

Wenn Sie alle unsere Variablen in jedes Modul importieren müssen, liegt ein schwerwiegender Fehler in Ihrem Design vor. Ich schlage vor, dass Sie Ihr Programm so umgestalten, dass die Elemente so voneinander getrennt sind, dass ein Minimum an Übersprechen zwischen ihnen besteht. Dies nennt man Entkopplung .

    
shawnhcorey 12.09.2011 18:27
quelle
1

Es klingt, als hätten Sie Daten in einer Datei und versuchen diese Daten in Ihr Programm zu laden.

Wie es jetzt ist, deklarieren die our -Deklarationen im Modul nur Variablen für den Umfang dieser Datei. Sobald die Datei beendet wird, müssen Sie ihren vollständig qualifizierten Namen verwenden, um auf die Variablen zuzugreifen. Wenn Ihr Modul eine package xyz; -Zeile hat, lautet der vollständig qualifizierte Name $xzy::Var1 . Wenn es keine package -Deklaration gibt, wird das Standardpaket main verwendet, was Ihren Variablen den Namen $main::Var1

gibt

Wenn Sie jedoch viele Variablen mit numerischen Namensänderungen erstellen, sollten Sie wahrscheinlich ein Array verwenden.

Ändern Sie Ihr Modul in etwas wie:

%Vor%

und dann Zugriff auf die Elemente nach Index:

%Vor%     
Eric Strom 12.09.2011 17:32
quelle
1

Sie möchten alle Variablen aus einem Modul exportieren und möchten dies so tun, dass Sie nicht einmal wissen, was Sie exportieren? Vergiss use strict und use warnings , denn wenn du sie in dein Programm legst, rennen sie nur schreiend raus und hocken sich hysterisch in einer Ecke weinend auf.

Ich nie, und ich meine nie, niemals Variablen exportieren. Ich erstelle immer eine Methode, um den erforderlichen Wert herauszuholen. Es gibt mir eine wichtige Kontrolle darüber, was ich der Außenwelt aussetze, und es hält den Namespace des Benutzers rein.

Sehen wir uns die möglichen Probleme mit Ihrer Idee an.

  1. Sie haben keine Ahnung, was in Ihrem Modul exportiert wird. Wie wird das Programm, das dieses Modul verwendet, wissen, was zu verwenden ist? Irgendwo müssen Sie dokumentieren, dass die Variablen $foo und @bar verfügbar sind. Wenn Sie das tun müssen, warum nicht einfach auf Nummer sicher gehen?
  2. Sie haben das Problem, dass jemand das Modul ändert, und plötzlich wird eine neue Variable mit diesem Modul in das Programm exportiert. Stellen Sie sich vor, wenn diese Variable bereits verwendet wurde. Das Programm hat plötzlich einen Fehler, und Sie werden nie in der Lage sein, es herauszufinden.
  3. Sie exportieren eine Variable in Ihr Modul, und der Entwickler entscheidet, diese Variable zu ändern oder sie sogar aus dem Programm zu entfernen. Da Sie nicht wissen, was importiert oder exportiert wird, können Sie nicht wissen, warum plötzlich ein Programmfehler aufgetreten ist.

Wie bereits erwähnt, müssen Sie wissen, was in Ihrem Modul verwendet wird, das das Programm verwenden kann. Sie müssen es also trotzdem dokumentieren. Wenn Sie darauf bestehen, Variablen zu importieren, verwenden Sie mindestens das EXPORT_OK -Array und das Exporter-Modul. Das wird helfen, den Schaden zu begrenzen. Auf diese Weise kann Ihr Programm deklarieren, welche Variablen davon abhängen und Ihr Modul kann deklarieren, welche Variablen es von Programmen kennt. Wenn ich das Modul modifiziere, würde ich besonders auf jede mögliche Variable achten, die ich sehe, die ich exportiere. Und wenn Sie in Ihrem Programm angeben müssen, welche Variablen Sie importieren, wissen Sie, dass Sie bei diesen bestimmten Variablen vorsichtig sind.

Warum sollten Sie sich sonst mit Modulen beschäftigen? Warum nicht einfach zu Perl 3.0 zurückkehren und require anstelle von use verwenden und vergessen, die package -Anweisung zu verwenden.

    
David W. 12.09.2011 21:07
quelle