Thread abgedrehtes problem mit switch: oder bin ich blind? (71 answers)
Opened by deepblack at 2004-06-16 21:56

Crian
 2004-07-07 17:25
#83486 #83486
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
(Als ich diesen Beitrag schrieb war pq's Beitrag noch nicht da, deshalb überschneidet sich dies...)

Interessant ist dieses:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use strict;
use warnings;

my $xxx = 1234;

BEGIN {
  warn $xxx;
  $xxx = 5678;
  warn $xxx;
}

warn $xxx;


Ausgabe:

Code: (dl )
1
2
3
4
Use of uninitialized value in warn at C:\Daten\perl\BEGIN.pl line 8.
Warning: something's wrong at C:\Daten\perl\BEGIN.pl line 8.
5678 at C:\Daten\perl\BEGIN.pl line 10.
1234 at C:\Daten\perl\BEGIN.pl line 13.



Ich erkläre mir das jetzt mal laienhaft so:

1) Deklaration der globalen im normalen Teil vor dem BEGIN wird interpretiert.

2) Der Code im BEGIN-Block wird interpretiert, dabei stößt Perl auf eine uninitialisierte unbekannte Variable.

3) Dann wird die Definition "= 1234" im normalen Code interpretiert.



Lässt man das Wort "BEGIN" weg, ist die Ausgabe diese:

Code: (dl )
1
2
3
1234 at C:\Daten\perl\BEGIN2.pl line 8.
5678 at C:\Daten\perl\BEGIN2.pl line 10.
5678 at C:\Daten\perl\BEGIN2.pl line 13.



Also: Möchte man lexikalische Variablen im BEGIN-Block definieren, so darf man sie außerhalb nur deklarieren, aber nicht definieren (also keinen Wert zuweisen), da dieser sonst die Initialisierung innerhalb des BEGIN-Blocks wieder überschreiben würde, da der Definitionsteil erst nach dem BEGIN-Block interpretiert wird:

Code: (dl )
1
2
3
4
#!/usr/bin/perl
use strict;
my $x; print $x;
BEGIN { $x = 'aha' }


Ausgabe: aha

Im Gegensatz zu

Code: (dl )
1
2
3
4
#!/usr/bin/perl
use strict;
my $x = 'NIX'; print $x;
BEGIN { $x = 'aha' }


welches NIXNIX ausgibt.

Alles ganz logisch, aber man muss es halt wissen, wie es funktioniert. Ich glaube ich habe es jetzt verstanden...\n\n

<!--EDIT|Crian|1089209158-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite

View full thread abgedrehtes problem mit switch: oder bin ich blind?