Schrift
[thread]7459[/thread]

globales package?

Leser: 1


<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
Froschpopo
 2005-11-11 13:53
#59955 #59955
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
wie in einem anderen post besprochen sollte ich in verbindung mit mod_perl2 packages verwenden.

Jetzt hab ich mich mal nen bissl belesen und ein kleines spielchen mit variablen veranstaltet:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;

package anfang;

my $sessionid = param('SESSIONID');

package alles_andere;

&modify_sid;
sub modify_sid {
my $new_sessionid = get_new_sid();
$anfang::sessionid = $new_sessionid;
}

package ende;

print $anfang::sessionid;

kann man das so stehenlassen oder gibts da nochetwas einzuwenden?Wie man sieht ändere ich in einem anderen package den wert einer globalen variable die NICHT im aktuellen package deklariert wurde.
GwenDragon
 2005-11-11 14:53
#59956 #59956
User since
2005-01-17
14760 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,11.11.2005, 12:53]Wie man sieht ändere ich in einem anderen package den wert einer globalen variable die NICHT im aktuellen package deklariert wurde.[/quote]
Nein, du änderst NICHT eine globale Variable, sondern die Variable $anfang::sessionid. Und die existiert im Package anfang.

Global und Lokal. Irgendwie bringst du das durcheinander.\n\n

<!--EDIT|GwenDragon|1131713733-->
Froschpopo
 2005-11-11 14:59
#59957 #59957
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
dankeschön :-)
mir fällt da spontan noch ein anderer punkt ein, worüber ich was im kamelbuch gelesen hatte...
Leider wird darauf nicht näher eingegangen:
das Package "main" ist ja wohl das Hauptprogramm.
Muss man das überhaupt benennen, oder ist automatisch mein script das package "main"?
Weil wenn das so wäre, dann könnte ich ja eigentlich gleich
Code: (dl )
my $main::sessionid = $main::cgi->param('SESSIONID')

auch ohne "package main" schreiben, ODER?\n\n

<!--EDIT|Froschpopo|1131714043-->
Taulmarill
 2005-11-11 15:01
#59958 #59958
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
du solltest vor allen dingen sicher stellen, dass perl nicht in mehreren threads läuft, die die variablen nicht sharen. ausserdem geht der inhalt der variable bei jedem neustart des servers verloren.

imho sollte jeder wert, der zwischen zwei aufrufen erhalten bleiben soll, entweder physisch auf der festplatte gespeichert werden, oder in ausnahmefällen über html-formulare "durchgereicht" werden, das erspart dir eine menge kopfschmerzen, da du dich nicht darum kümmern must, in welchen packages was genau wie angesprochen werden kann.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Froschpopo
 2005-11-11 15:05
#59959 #59959
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich dachte aber, dass mod_perl alles in einen handler packt:
Code: (dl )
1
2
3
4
5
6
sub handler {
  my $sessionid = $main::cgi->param('SESSIONID');
  sub router {
# print $sessionid;
}
}

in irgendeinem anderen thread hat man mir also dazu geraten, package-variablen zu verwenden. Darf auf keinen Fall passieren, dass z.B. ein user die $sessionid von einem anderen zu gesicht bekommt.\n\n

<!--EDIT|Froschpopo|1131714444-->
GwenDragon
 2005-11-11 15:07
#59960 #59960
User since
2005-01-17
14760 Artikel
Admin1
[Homepage]
user image
main ist immer das Hauptprogramm sprich Skript.

Achte darauf, dass du vor dem Start des Programms, also in BEGIN {} die Variablen, die im Programm global sind, sauber initialisierst und am Ende also im Block END {} wieder mit undef löschst.


Wenn du Vraiablen an ein anderes Skript weiter rreichen willst, benutze doch Apache::Session mit einem festen Session-ID.
GwenDragon
 2005-11-11 15:11
#59961 #59961
User since
2005-01-17
14760 Artikel
Admin1
[Homepage]
user image
Scxhau mal unter http://www.farid-hajji.net/books....on.html da steht so einiges über wie Speicherung und Weitergabe von Variablen.
Froschpopo
 2005-11-11 15:22
#59962 #59962
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Wieso an ein anderes Script? ich hab nur eins. Das wird aber immerwieder aufgerufen, nur mit unterschiedlichen parametern.
ungefähr so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
sub public_vars {
  my %my_vars = (
     'home' => \&home
  );
  if (exists($my_vars{$main::cgi->param('PAGEID')})) {
     &{$my_vars{$main::cgi->param('PAGEID')}};
  } else {
     # Fehler 404
  }
}


Nun habe ich aber u.a. Variab Daten, die Dinge verwenden, die ich im gesamten Script benötige ! Z.B. die Sessionid des Users, oder eine Konfigurationsdatei die sämtliche Pfade etc. enthält. Ich fänds ziemlich blödsinnig, diese Datei in jeder subroutine zu öffnen.. Deshalb dachte, hätte ich gerne diese ganzen Config-Vars in einem Hash, den ich aus jeder subroutine aus abfragen kann.

z.b. in %main::config_list
oder so.\n\n

<!--EDIT|Froschpopo|1131715401-->
pq
 2005-11-11 16:30
#59963 #59963
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
froschpopo, du hast mich falsch verstanden. ich habe dir dringend geraten,
möglichst *keine* globalen variablen zubenutzen. möglichst alles als argumente übergeben.
und möglichst in module auslagern.
du liest meinen ratschlag aber so, wie du es lesen willst.
$main::cgi ist absoluter blödsinn, denn gerade das ist eine variable, die sich bei jedem request
ändert und *nicht* global sein sollte.

edit: vielleicht ist es doch besser, du bleibst bei CGI und holst dir ne zweite
kiste und ne dritte als loadbalancer, bevor du dich hier mit irgendwelchen
pachages verrenkst und im grunde nicht verstehst, was der code macht.\n\n

<!--EDIT|pq|1131719561-->
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
Froschpopo
 2005-11-11 17:47
#59964 #59964
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
so, jetzt hab ich alles bei "my" belassen und fertig. funzt prima. Alles bestens.
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2005-11-11 13:53.