Was ist falsch in diesem Perl-Ausdruck?

7

Was ist das Problem mit dem Folgen? Ich bekomme $attribute not defined error.

%Vor%     
TopCoder 08.12.2011, 05:22
quelle

4 Antworten

10

Du bist zu schlau. Tun Sie das einfach:

%Vor%

Die Probleme sind zweifach:

  • Sie haben ein zusätzliches ) in Ihrem if
  • my im Ausdruck Kontext bindet sehr eng; $attribute ist nicht im lexikalischen Bereich bis zum Hauptteil der bedingten Anweisung , die sie enthält, sodass der andere Zweig von and nicht darauf zugreifen kann. Sie müssen es wie in meinem Beispiel in den enthaltenden Kontext heben.
bdonlan 08.12.2011, 05:27
quelle
10

use strict; hätte das Problem gefunden.

%Vor%

Eine my -Deklaration wirkt sich nur auf nachfolgende Anweisungen aus, nicht auf die Anweisung, in der sich die Deklaration befindet. (Gleiches gilt für die Deklarationen our und local .) Das heißt $attribute , das Sie mit my erstellen und dem Sie eine andere Variable zuweisen als $attribute , das Sie mit Y vergleichen. Du willst

%Vor%

Wenn nun $Data->{is_new} nicht existiert oder nicht definiert ist, wird $attribute undefiniert sein und der Vergleich mit Y wird eine Warnung ausgeben. Sie können diese Warnung wie folgt vermeiden:

%Vor%

Alternativ: (5.10 +)

%Vor%     
ikegami 08.12.2011 07:01
quelle
1

Die anderen Antworten sind gut. Ich möchte nur hinzufügen, dass, wenn Sie vermeiden möchten, den umgebenden Bereich mit der $attribute Variable zu überlisten, Sie tun könnten:

%Vor%

Dies funktioniert auch mit strict und warnings .

    
flesk 08.12.2011 08:03
quelle
0

Wie bereits erwähnt, können Sie keine Variable deklarieren und gleichzeitig verwenden. So ist es halt; Sie müssen die Deklarationsanweisung abschließen, bevor Sie die neue Variable verwenden können.

Was Sie jedoch getan haben könnten, und ich bin ehrlich gesagt etwas verloren , warum dies noch nicht erwähnt wurde, ist dies:

%Vor%

$attribute ist noch nicht deklariert, aber $Data->{'is_new'} ist .

Nur um klar zu sein: Der Punkt dieser if-Anweisung wäre dann drei Dinge:

  • Initialisiere und weise einen Wert $attribute zu
  • Überprüfen Sie, ob dieser Wert nicht undefiniert ist / leere Zeichenfolge / null
  • Überprüfen Sie, ob dieser Wert 'Y' ist

Der lexikalische Geltungsbereich von $attribute ist das Innere des if-Statements nachfolgenden Blocks, nicht mehr und nicht weniger.

    
TLP 08.12.2011 12:39
quelle

Tags und Links