perl namensraum

*Sheep

des Unterseepudels Kern
Code:
#!/usr/pkg/bin/perl -w
use strict;
my $A = 1;
if ( $A > 0 ){
        printf("$A ist groesser 0\n");
        my $B = 2;
}
else {
        printf("$A ist kleiner gleich 0\n");
        my $B = 19;
}
printf("B ist: $B \n");

Fehlermeldung beim Ausführen:
Global symbol "$B" requires explicit package name at ./test.pl line 12.
Execution of ./test.pl aborted due to compilation errors.

Ok, ich bin nicht so der perl-haxx0r. Ich möchte abhängig von var A die var B setzen. In diesem Fall ist natürlich A konstant. Warum beschwert sich perl da?
 
Ich hab absolut keine Ahnung von Perl, ich mag es auch nicht wirklich, aber evtl liegt es am Scope: D.h., das $B ist ausserhalb der if-Condition (bzw. dem else) nicht sichtbar.
Versuch mal, VOR dem if $B auf 0 zu setzen und den Wert dann erst in der if bzw. dem else zu modifizieren, evtl hilft das :)
 
Code:
#!/usr/pkg/bin/perl -w
use strict;
my $A = 1;
my $B;
if ( $A > 0 ){
        printf("$A ist groesser 0\n");
        $B = 2;
}
else {
        printf("$A ist kleiner gleich 0\n");
        $B = 19;
}
printf("B ist: $B \n");

1 ist groesser 0
B ist: 2


Oki, aber warum...ich bin doch immernoch im Namesraum main, oder?
 
Code:
printf("B ist: $B \n");

"Verursacht" den Fehler:
Global symbol "$B" requires explicit package name at ./test.pl line 12.
Execution of ./test.pl aborted due to compilation errors.

Wenn du vor eine neue Variable ein
my
setzt, so gibst du den Gültigkeitsbereicht (scope) an.

Deine beiden Variablen
my $B
sind nur in den Schleifen gültig.
Nachher rufst du aber ausserhalb der Schleife den Wert der Variable ab.

Du musst also
my $B
ausserhalb der Schleifen deklarieren, wenn auch ohne ihr einen Wert zu geben,
damit du sie nacheher ausserhalb der Schleifen abfragen kannst:

Code:
use strict;
my $A = 0;
my $B = "";
if ( $A > 0 ){
        printf("$A ist groesser 0\n");
        $B = 2;
}
else {
        printf("$A ist kleiner gleich 0\n");
        $B = 19;
}
printf("B ist: $B \n");
 
Klar bist du das, obwohl ich nicht weiss, inwiefern Perl überhaupt Namespaces unterstützt.
Die Sache ist aber die, dass Du $B erst in der Condition deklarierst. Damit ist die Variable ausserhalb der Condition nicht sichtbar.

Krasseres Beispiel wäre eine C-Funktion:
Code:
void test() {
   const char* a = "test";
}

void anothertest() {
   printf(a);
}

int main(int argc, char** argv) {
  test();
  anothertest();
}

Ausgabe:
Code:
Line 6: 'a' not defined.
 
Mal ne ganz bloede Frage.
Ich hab erst vor ein paar Tagen angefangen das Buch Einführung in Perl durchzuarbeiten.
Warum hast du in dem kleinen Programm überhaupt 'strict' verwendet?
 
use strict;
use warnings;

sind essentiell, egal wie groß das Script ist. ;)

Ein kleiner Buchstabendreher kann einem sonst ganz schnell zur Verzweiflung bringen.

@ *Sheep

Eine Varibale innerhalb eines Blockes ist BLOCK-LOKAL. Das ist auch in anderen Sprachen so. Das ist auch nützlich, zb innerhalb einer for()-Schleife.

r0b0
 
Zurück
Oben