Schrift
[thread]11792[/thread]

Scope? .. wieder mal



<< >> 7 Einträge, 1 Seite
RalphFFM
 2008-05-12 14:26
#109605 #109605
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo, ich hätte gedacht strict würde meckern bei:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
use warnings;
use strict;
my $var;
BEGIN {
        $var="Hallo Welt";
        print "innen: $var\n";
}
print "aussen: $var\n";

innen: Hallo Welt
aussen: Hallo Welt

Wie kommt das? Wird das "my $var;" nicht erst _nach_ dem BEGIN-Block abgearbeitet?
Danke für Rat.
FoolAck
 2008-05-12 15:00
#109606 #109606
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Das würde mich auch mal interessieren.

Also "use" wird wohl auch in einem BEGIN Block abgearbeitet, wenn ich das jetzt richtig verstanden habe und gilt somit "sofort" (sonst würde das Skript auch nicht "aussen: Hallo Welt" ausgeben..).

Und BEGIN Blocks werden irgendwie "augenblicklich" eval'ed, sprich so früh wie möglich. Aber wohl auf jeden Fall vor dem "normalen" Code. Und "my" sollte da keine Ausnahme sein.

Und wenn man die Reihenfolge ändert meckert er rum wie er soll(Global symbol "$var" requires explicit package), sprich wenn man den BEGIN-Block vor das "my $var" Statement packt, aber wie der TE schon anmerkte: das sollte doch Jacke wie Hose sein, wo der BEGIN-Block zwischen normalem code platziert ist. Ahh.

Aufdass Jemand Licht in dieses Dunkel bringt.
renee
 2008-05-12 15:51
#109609 #109609
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Der Compiler geht das Programm Zeile für Zeile durch. Ein "my" weist den Compiler an, die Variable anzulegen (aber noch keine Zuweisung zu machen). Danach kommt der Compiler zu dem BEGIN-Block und das innerhalb des BEGIN-Blocks wird abgearbeitet. Da zu diesem Zeitpunkt die Variable schon angelegt ist, meckert strict nicht rum.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
RalphFFM
 2008-05-12 16:51
#109613 #109613
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wieso meckert strict dann bei folgendem?
Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl
use warnings;
use strict;
my $var = "Hallo Welt";
BEGIN {
        print "innen: $var\n";
}
print "aussen: $var\n";
Use of uninitialized value in concatenation (.) or string at /tmp/unbenannt line 6.
innen:
aussen: Hallo Welt

Der Skalar müßte ja dann ebenfalls schon angelegt sein. -> Ich denke der Kernpunkt liegt darin, was der Begriff "angelegt" _genau_ beinhaltet? (Laut Fehlermeldung bedeutet "angelegt" offenbar noch kein "initialisiert".)
FoolAck
 2008-05-12 16:58
#109615 #109615
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Hat renee doch schon gesagt: die Variable wird erstellt, ihr wird aber noch kein Wert zugewiesen zu dem Zeitpunkt.
Code (perl): (dl )
1
2
3
4
use strict;
use warnings;
my $var;
print "bla $var blub";

gibt dir den Fehler auch..

edit:
Quote
Wieso meckert strict dann bei folgendem?

Tuts nicht.. Das ist das "warnings".
renee
 2008-05-13 10:08
#109641 #109641
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
renee+2008-05-12 13:51:56--
[...]Ein "my" weist den Compiler an, die Variable anzulegen (aber noch keine Zuweisung zu machen). [...]


!!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
KurtZ
 2008-05-13 16:38
#109656 #109656
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
renee+2008-05-13 08:08:22--
renee+2008-05-12 13:51:56--
[...]Ein "my" weist den Compiler an, die Variable anzulegen (aber noch keine Zuweisung zu machen). [...]


also ... mein Gefühl ist das noch das die Variable da noch nicht physikalisch angelegt wird. Die Deklaration teilt dem Compiler mit *wo* er die Variable anzulegen hat, wenn sie denn endlich initialisiert/benutzt wird.

Naja ...wie auch immer, hier reichts sich den Unterschied zwischen Initialisierung und Deklaration zu verdeutlichen.

NACHTRAG:

nein, sie wird tatsächlich bereits angelegt!
Code (perl): (dl )
1
2
our $xxxxxxx;
foreach $v (keys %main::) { print "main> $v\n" if $v =~ /xxxxxxx/}
TMTOWTDYOG (there's more than one way to dig your own grave)
<< >> 7 Einträge, 1 Seite



View all threads created 2008-05-12 14:26.