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

Globale variable: in packages nutzen?

Leser: 2


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
styx-cc
 2006-07-11 19:54
#68055 #68055
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Hallo :-)
Ich hab nen kleines Problem, ich will eine globale Variable erzeugen, auf die ich auch in anderen Packages zugreifen kann.

Folgendes hab ich versucht:
main.pl:
Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl -w
use strict;

use foo;

our $test = "test";
print "main:: $test";
&foo::out();


Dann das Package:
Code: (dl )
1
2
3
package foo;
sub out {print "$test"};
1;


Vielen Dank im Voraus ..

MfG, stefan\n\n

<!--EDIT|styx-cc|1152633347-->
Pörl.
GwenDragon
 2006-07-11 20:11
#68056 #68056
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl -w
use strict;

our $test = "teast";
print "main:: $test\n";
&foo::out();

package foo;
sub out {print __PACKAGE__ . ":: $test\n"};
1;


Geht doch ;)
styx-cc
 2006-07-11 20:26
#68057 #68057
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Also bei mir klappts nich..
Ich erklaer mal etwas genauer, ich will aus einer Datei die foglendes Format hat einen Hash befuellen:

Code: (dl )
1
2
3
4
5
6
7
8
9
#directorys
root_dir=G:/programmierung/perl/ager
data_dir=data/
images_dir=images/

#design & style

button_color=
[...]


Das habe ich wie folgt geloest (manipulate.pm):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sub load_config {
my @args = qw/root_dir data_dir images_dir button_color alternatecolor_first alternatecolor_second marked_color/;

open(CONF, "<depot_conf.conf") or die("Can't open depot_conf.conf: $!");
for (<CONF>) {
next if ( (/^#/) || (/^\W/) ); #ignore comments
chomp;
my @parts = split(/=/, $_);
my ($var, $value) = @parts;

for my $option ($#args) {
if ($var eq "$option") {
__GUI__ $config{$var} = $value;
last;
}
print "$var:" . __PACKAGE__ . "$config{$var}\n";
}
}
close CONF;
}


Das ganze wird von GUI.pm aus aufgerufen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
package GUI;
use strict;

sub start {
use Depot::manipulate;

our %config = ();
&manipulate::load_config();
}
1;


Leider erhalte ich ich die Fehlermedlung:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
G:\programmierung\perl\lager>perl lager.txt
Global symbol "%config" requires explicit package name at Depot/manipulate.pm li
ne 16.
syntax error at Depot/manipulate.pm line 16, near "$config{"
Global symbol "%config" requires explicit package name at Depot/manipulate.pm li
ne 19.
syntax error at Depot/manipulate.pm line 23, near "}"
Compilation failed in require at Depot/GUI.pm line 5.
BEGIN failed--compilation aborted at Depot/GUI.pm line 5.
Compilation failed in require at lager.txt line 6.
BEGIN failed--compilation aborted at lager.txt line 6.


Vielen Dank :)
MfG
Pörl.
lichtkind
 2006-07-11 20:59
#68058 #68058
User since
2004-03-22
5697 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
normal schreibt man nicht main:: $test sondern $main::test

du meintest sicher auch $GUI::config{$var}\n\n

<!--EDIT|lichtkind|1152637339-->
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
styx-cc
 2006-07-11 21:12
#68059 #68059
User since
2006-05-20
533 Artikel
BenutzerIn

user image
:- )
Vielen Dank, funktioniert..

MfG
Pörl.
betterworld
 2006-07-11 21:18
#68060 #68060
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Einfacher ist da eigentlich die Benutzung von Exporter. Damit sorgt man auch gleich noch dafuer, dass Tippfehler als Compilerfehler bemerkt werden.
Code: (dl )
1
2
3
4
5
6
package Foo;
use strict;
use base qw(Exporter);
our @EXPORT_OK = qw($test);
our $test = 7;
1


Code: (dl )
1
2
3
4
use strict;
use Foo qw($test);

print $test, "\n";


(ungetestet)
pq
 2006-07-11 21:45
#68061 #68061
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
generell würde ich in modulen/packages nicht auf globale variablen
zugreifen, bei denen ich mich darauf verlassen muss, dass sie
an einer anderen stelle gesetzt wurden. entweder man löst es über
argumente an subroutinen/methoden oder mittels Exporter, wie
betterworld es gezeigt hat.
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
styx-cc
 2006-07-11 23:28
#68062 #68062
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Wie soll ich des mit dem Exporter denn machen, da wo ich die Variable brauche (manipulate.pm) wird nirgens "use GUI" angegeben, aber in GUI.pm wird %config deklariert...

MfG

edit: ich hab naetuerlich schon selber ausprobiert..\n\n

<!--EDIT|styx-cc|1152646671-->
Pörl.
betterworld
 2006-07-11 23:46
#68063 #68063
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=styx-cc,11.07.2006, 21:28]Wie soll ich des mit dem Exporter denn machen, da wo ich die Variable brauche (manipulate.pm) wird nirgens "use GUI" angegeben[/quote]
Dann schreib doch einfach "use GUI"; oder hat es einen besonderen Grund, dass es da nicht steht?
styx-cc
 2006-07-12 00:59
#68064 #68064
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Soo, ich hab das jetzt wie folg ueberarbeitet, aber des will nich : (

GUI.pm
Code: (dl )
1
2
3
4
5
6
7
8
9
package GUI;
use strict;
use diagnostics;
[...]
use base qw(Exporter);
our @EXPORT_OK = qw(%config);
[...]
our %config = ();
&manipulate::load_config();


manipulate.pm
Code: (dl )
1
2
3
4
5
6
7
8
package manipulate;
use strict;
use Depot::GUI;
[...]
if ($var eq "$option") {
$config{$var} = $value if $value;
last;
}


er meckert halt immer noch, das %config deklariert werden soll..

MfG
Pörl.
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2006-07-11 19:54.