Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7883[/thread]

generelle Varablen Frage:



<< >> 7 Einträge, 1 Seite
galaxy
 2006-04-12 17:33
#64783 #64783
User since
2006-04-03
30 Artikel
BenutzerIn
[default_avatar]
Dachte man kann in perl zwischen globalen und lokalen Variablen unterscheiden un das "wort" my würde dabei die lokalen kennzeichnen.

Definiere ich in meinem Skript jedoch eine Variable ohne my, also so z.B $Wort, dann kommt immer die Fehlermeldung:

Global sysmbol $wort requires explicit package name.

Liegt das daran, das ich Module eingebunden habe? Wie kann ich das Problem lösen?

Danke für Tipps
Ronnie
 2006-04-12 17:49
#64784 #64784
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Solange du use strict; use warnings; verwendest wirst du entsprechende Fehlermeldungen erhalten - was auch richtig und sinnvoll ist. Wenn du explizit globale Variablen willst musst du diese mit our deklarieren. Ansonsten ist es meistens auch okay my zu verwenden, wenn der lexikalische Geltungsbereich das Skript ist - kann aber zu Problemen mit mod_perl führen!
Strat
 2006-04-12 17:54
#64785 #64785
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
globale variablen in perl gibt es eigentlich nicht; fast das gleiche sind jedoch packagevariablen (nicht my-variablen).

wenn du, wie es sich gehoert, mit use strict arbeitest, weist es dich unter anderem darauf hin, wenn ihm noch unbekannte variablen (mit ausnahme der Builtins wie %ENV, $a, $b, @INC, $_, @_, ... -> perlvar) unterkommen.
wenn du eine variable explizit als nicht-my-variable verwenden willst (kommt zwar aeusserst selten vor, aber doch gelegentlich), kann man auch packagevariablen deklarieren:
Code: (dl )
1
2
3
4
5
6
7
# ab perl5.6
our $GlobalVar1 = 20;

# oder der alte, immer noch gueltige weg
use vars qw($GlobalVar2 @GlobalArray);
$GlobalVar2 = 30;
@GlobalArray = (1..50);


Meiner Meinung nach sollte man "globale" Variablen nur unter folgenden Umstaenden verwenden:
1. der Wert der Variablen aendert sich nicht (z.B. bei Konfigurationen, wobei da CPAN:Readonly der oft bessere weg ist
2. das Script hat nicht mehr als 10 zeilen

fuer fast alles andere sind closures in kombination mit my-variablen der bessere weg
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2006-04-12 20:57
#64786 #64786
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Ronnie,12.04.2006, 15:49]Ansonsten ist es meistens auch okay my zu verwenden, wenn der lexikalische Geltungsbereich das Skript ist - kann aber zu Problemen mit mod_perl führen![/quote]
wieso kann my() bei mod_perl zu problemen führen?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Ronnie
 2006-04-12 21:38
#64787 #64787
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Kann sein das ich da falsch liege, da ich mod_perl nicht verwende, aber AFAIR ist folgendes keine gute Idee bei mod_perl:
Code: (dl )
1
2
3
4
5
6
my $omega = 1;

sub test {
$omega++;
return $omega;
}

Das Problem entsteht da die Funktion test() auch ein closure darstellt und die Variable $omega außerhalb ihres lexikalischen Bereichs erstellt wird und nicht explizit an die Funktion übergeben wird.

Wie gesagt, da kann ich auch voll daneben liegen, aber hatte es irgendwann so verinnerlicht.\n\n

<!--EDIT|Ronnie|1144863637-->
ptk
 2006-04-12 22:46
#64788 #64788
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Es hängt davon ab, ob du einen echten mod_perl-Handler schreibst oder ein CGI unter Apache::Registry laufen lässt. Bei ersterem gibt es kein Problem mit file-globalen lexikalischen Variablen.
pq
 2006-04-13 01:23
#64789 #64789
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
genau, weil bei einem CGI unter Apache::Registry noch eine sub handler
um den code herumgeschrieben wird.
ansonsten kann man so viele my-variablen haben, wie man lustig ist...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 7 Einträge, 1 Seite



View all threads created 2006-04-12 17:33.