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.
Ä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:
... erlaubt dem Skript, 1\n
korrekt auszudrucken.
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 .
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
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% 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.
$foo
und @bar
verfügbar sind. Wenn Sie das tun müssen, warum nicht einfach auf Nummer sicher gehen? 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.
Tags und Links perl module import global-variables