Schrift
[thread]12837[/thread]

Geltungsbereiche

Leser: 3


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Kean
 2008-11-28 13:24
#116684 #116684
User since
2004-08-18
463 Artikel
BenutzerIn

user image
Ich habe eine Verständnisfrage wegen den Geltungsbereichen.

Beispiel:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
use warnings;

my $var = 0;
test();
exit;

sub test
{
$var = 1;
}


Hier gibt es doch 2 Geltungsbereiche, einmal Main und einmal test. Gibt es keine Möglichkeit von dem Bereich test auf Variablen in Main zuzugreifen (z.b. durch main::$var)?

Sind Variablen bzw. Objekte die ich in Main mit our deklariere nicht in Global verfügbar?
pktm
 2008-11-28 13:31
#116685 #116685
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Wenn du Geltungsbereiche benutzen willst, musst du ersteinmal use strict; reinschreiben.
Und dann willst du wahrscheinlich mit Referenzen arbeiten.
http://www.intergastro-service.de (mein erstes CMS :) )
Kean
 2008-11-28 13:34
#116686 #116686
User since
2004-08-18
463 Artikel
BenutzerIn

user image
pktm+2008-11-28 12:31:15--
Wenn du Geltungsbereiche benutzen willst, musst du ersteinmal use strict; reinschreiben.
Und dann willst du wahrscheinlich mit Referenzen arbeiten.


Ich will auf Objekte und Variablen zugreifen, wenn ich dafür Referenzen brauche dann schon..
renee
 2008-11-28 13:55
#116688 #116688
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
pktm+2008-11-28 12:31:15--
Wenn du Geltungsbereiche benutzen willst, musst du ersteinmal use strict; reinschreiben.


Nein, strict zwingt einen nur, mehr über Gültigkeitsbereiche und Deklarationen nachzudenken. Probier mal
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

my $test = 'hallo';

test();

print $test, " - ", $hallo;

sub test{
    print "in test(): $test\n";
    my $hallo = 2;
}


Quote
Und dann willst du wahrscheinlich mit Referenzen arbeiten.


Kommt darauf an... Man kann ganz normal mit Subroutinen-Parametern arbeiten. Da muss nicht alles eine Referenz sein.
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/
renee
 2008-11-28 13:58
#116689 #116689
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kean+2008-11-28 12:24:10--
Ich habe eine Verständnisfrage wegen den Geltungsbereichen.

Beispiel:
[...]

Du solltest in test auf die my-Variable aus main zugreifen können (wenn es in der gleichen Datei steht)

[quote] Gibt es keine Möglichkeit von dem Bereich test auf Variablen in Main zuzugreifen (z.b. durch main::$var)?
Quote
Das hat dann $main::var
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/
MatthiasW
 2008-11-28 14:02
#116690 #116690
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Möchtest du in test() eine eigene Variable $var haben, dann musst du sie mit my deklarieren.
Genauso funktioniert das auch mit allen anderen Gültigkeitsbereichen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use strict;
use warnings;

{
    my $var = 1;
    {
        print $var;
        my $var = 2;
        print $var;
    }
    print $var;
}

Gibt 121 aus.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
LanX-
 2008-11-28 15:54
#116693 #116693
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
hmm, diese Fragen kommen immer wieder auf weil 2 verscheidene Dimensionen von Perl durcheinandergeworfen werden.

1. Deklaration und Geltungsbereiche
2. Unterschied zw. Packagevariablen und lexikalischen Variablen.

Der Geltungsbereich ("scope") ist erstmal ein Codestück zwischen Deklarationsstelle und Ende des aktuellen Blocks (d.h. nächster schließenden Klammer der gleichen "Ebene"). Das aktuelle File ist der größtmögliche Geltungsbereich.

Deklarationen sind my und our die zum Compilierungszeitpunkt festlegen speicherbereiche den Variablennamen im scope zugewiesen werden. (local ist keine Deklaration!)

Speicherstellen sind hashähnliche interne Strukturen wo Perl seine Variableninhalte ablegt. Für Packages heißen diese stash (= Symbol Table haSH) für Blöcke (lex)pad.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# file

{ # code blockebene 1

   # code1 ebene1

   my $x; our $y;  # Anfang Geltungsbereich $x,$y in Ebene 1
 
  { 
   # code blockebene 2 

   package NEU;
   my $x; our $y;  # Anfang Geltungsbereich $x,$y in Ebene 2

   print $x; # $x in Lexpad 2
   print $y; # $y in Package "NEU", also $NEU::y;

   }# Ende Block2 und der Geltungsbereiche von $x,$y, und NEU
   our $z; # =$main::z; weil Geltungsbereich von package NEU verlassen.

} # Ende Geltungsbereich 1 $x,$y

#ende Geltungsgbereich file


was passiert mit deklarierten Variablennamen im Geltungsbereich?

1. by my $x wird gehört jedes $x im Geltungsbereich zum Lexpad des umfassenden Blockes
2. by our $y gehört jedes $y im Geltungsbereich zum Package zum Deklarationszeitpunkt, hier also ist $y= $main::y.

Der Befehl "package"unterliegt auch dem Blockscoping.

Neue Geltungsbereiche überschreiben lokal alte.

Bitte um Rückfragen bei Unklarheiten, bei Bedarf mach ich mal nen detaillierten TWiki-Artikel draus.
scriptor
 2008-11-29 12:59
#116698 #116698
User since
2008-05-07
69 Artikel
BenutzerIn
[Homepage] [default_avatar]
LanX-+2008-11-28 14:54:30--
Bitte um Rückfragen bei Unklarheiten, bei Bedarf mach ich mal nen detaillierten TWiki-Artikel draus.


Das wäre toll!
Ich hatte vor ein paar Monaten auch Probleme, die zurückblickend damit zusammenhingen. Damals habe ich mich nicht zu einer Frage hier aufraffen können, weil das Modul nur ein vorübergehender Hack sein sollte.

Fühle Dich ermutigt!
LanX-
 2008-11-29 15:12
#116705 #116705
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
scriptor+2008-11-29 11:59:58--
LanX-+2008-11-28 14:54:30--
Bitte um Rückfragen bei Unklarheiten, bei Bedarf mach ich mal nen detaillierten TWiki-Artikel draus.

...Fühle Dich ermutigt!


ja aber was ist jetzt noch unklar, wo soll ich ins Detail gehen?
LanX-
 2008-12-01 15:05
#116767 #116767
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
[s]MOMENT MAL: Dieser Thread war mal viel länger, Renee hat z.B. auch auf wantarray hingewiesen!

Ist das jetzt ein Bug oder wurde etwa zensiert???[/s]

Definitiv ein BUG, aber in meinem Hirn! Sorry ich meinte die andere großenTheoriediskussion...
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2008-11-28 13:24.