Wie überprüft man, ob die Variable in Perl deklariert ist?

8

Ich benutze use strict; in Perl und damit benutze ich die folgende Anweisung.

%Vor%

Wo $ x nirgendwo deklariert ist. Also erwarte ich, dass es " Not defined " ausgibt, aber es gibt einen Fehler zurück

%Vor%     
Shubham 21.08.2010, 11:00
quelle

7 Antworten

18

Das strict Pragma besteht aus drei Teilen: strikte Referenzen, strikte Variablen und strikte Subs. Der, in den du hineinrennst, ist

  

strikte vars

     

Dies erzeugt einen Kompilierungsfehler, wenn Sie auf eine Variable zugreifen, die nicht über our oder use vars deklariert wurde, die über my lokalisiert wurde oder die nicht vollständig qualifiziert war. Weil dies variable Suizidprobleme und subtile dynamische Scoping-Probleme vermeidet, ist eine lediglich local Variable nicht gut genug.

Da es Fehler bei der Kompilierung generiert, hat Ihr nicht BEGIN -Code nicht einmal eine Chance zu laufen. Sie können vorübergehend nicht-strikte Variablen innerhalb eines Blocks wie in

zulassen %Vor%

Beachten Sie jedoch, dass Perls defined -Operator Ihnen sagt, ob ein Wert definiert ist und nicht, ob eine Variable deklariert wurde.

Erzähl uns mehr über deine Anwendung und wir können dir bessere Ratschläge geben, wie du damit umgehen sollst.

    
Greg Bacon 21.08.2010, 11:07
quelle
5

Sie können nicht nur auf eine Variable verweisen, wenn sie nicht deklariert ist. Wenn du fragst

%Vor%

Der Compiler wird sich beschweren: Ich weiß nicht, wonach Sie fragen, wie soll ich sagen, dass es definiert ist? Es hat keinen Bezugspunkt für diese Variable, da Sie angegeben haben, dass Variablen nicht automatisch nach Namen erstellt werden sollen.

Wenn strict 'vars' nicht aktiviert war - was standardmäßig bei use strict der Fall ist - würde es einen Eintrag in der Paketsymboltabelle für 'x' erzeugen.

Interessanterweise ist es ohne strict 'refs' auch einfach zu überprüfen, ob eine Variable in der Paketsymboltabelle enthalten ist.

%Vor%

Da es keine Möglichkeit gibt, lexikalisch ("meine Variablen") automatisch zu erstellen, gibt es auch keine Standardmethode, um zu überprüfen, ob Lexika deklariert sind. Lexikalische Variablen werden im "Pad" gespeichert. Aber es gibt ein Modul PadWalker , das helfen kann.

Um das aktuelle Niveau zu überprüfen, könnten Sie einen Hash des Pads erhalten und dann prüfen, ob es im aktuellen Pad existiert oder nicht. Sie können auch eine Schleife durch den Stack durchlaufen (das Integer-Argument funktioniert etwa wie caller ), um herauszufinden, wo das letzte x war.

%Vor%     
Axeman 21.08.2010 18:38
quelle
5

Ich denke, Sie mischen "definierte" und "erklärte" Konzepte.

Sie fragen nach 'Wie überprüft man, ob die Variable in Perl deklariert ist', aber dann prüfen Sie, ob eine Variable definiert ist. Dies sind zwei verschiedene Konzepte.

In Perl, wenn Sie 'use strict' verwenden , suchen Sie automatisch nach Nicht deklariert ( mein , lokal) oder unser ). Sobald Sie eine Variable deklariert haben, können Sie testen, ob sie definiert ist (haben Sie einen Wert zugewiesen).

In Ihrem Test fehlt also eine vorherige Deklaration, bevor Sie die Definierbarkeit testen

%Vor%

Bitte beachten Sie, dass der Test für nur $ x für Ihren Zweck falsch ist:

%Vor%

Schließlich scheint die Antwort von Xenorrazid für mich fehlerhaft zu sein: Er schlägt vor, es sei denn, $ x 'ist nicht korrekt, zum Testen, wenn es so definiert ist, wie ich es vorher gesagt habe. Er schlägt auch 'vor, wenn exists $ x', das ist falsch beim Testen von Skalaren . 'Existiert' Test ist nur für Hash-Schlüssel (und veraltet für Arrays).

Hoffe, das hilft.

    
Pablo Marin-Garcia 22.08.2010 02:02
quelle
1
%Vor%

Ergebnis wird

sein

Nicht definiert

%Vor%

erzeugt einen Fehler wie in Ihrer Frage.

Schauen Sie nach: Ссылка , wo beschrieben wurde, wie Sie nur die erforderlichen Einschränkungen importieren können. (Verwenden Sie jedoch strikt "Vars" ist eine sehr gute Idee :))

    
Michael Pakhantsov 21.08.2010 11:09
quelle
1

Normalerweise sollte diese Art von Code nicht für ein ernstes Programm benötigt werden, aber warum nicht nur zum Spaß: (unter der Annahme, streng)

%Vor%     
Nilesh 06.11.2012 14:29
quelle
0
%Vor%     
xoid 16.05.2013 08:08
quelle
0

meine Lösung ist     #! / usr / bin / perl -l

%Vor%     
xoid 16.05.2013 08:26
quelle

Tags und Links