Schrift
[thread]11161[/thread]

Globale Variable auch im .pm-Package



<< >> 10 Einträge, 1 Seite
RalphFFM
 2008-01-20 19:56
#104947 #104947
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

ich habe ein Skript und ein Package, und möchte nun gerne eine globale Variable
auch im Package verfügbar haben. Möchte aber die Variable nicht wie sonst per
Übergabeparameter übergeben.

Die globale Variable ist im Package unbekannt. Global symbol "$global" requires
explicit package name at test.pm line 12. Irgendwie sitze ich da gerade
"wie der Ochs vorm Berg". Im voraus Danke für Hilfe. :-o

Gruß, Ralph

Code (perl): (dl )
1
2
3
4
5
6
7
#!/usr/bin/perl
use strict;
use warnings;
use lib '.';
use test;
my $global = "Diese Welt";
mysub ("Jene Welt");


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package test;
require Exporter;
use strict;
use warnings;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
$VERSION = 1.0;
@ISA     = qw(Exporter);
@EXPORT  = qw(mysub);
sub mysub {
        my $lokal = shift;
        print "\$lokal: $lokal\n";
        print "\$global: $global\n";
}
1;
betterworld
 2008-01-20 20:00
#104948 #104948
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Globale Variablen sind eigentlich doof.

Aber das wäre eine Lösung: Du benutzt ja eh schon Exporter. Exportiere einfach eine Variable aus dem Modul und setze sie dann in dem Script. Vielleicht in einem INIT{}-Block oder so, muss aber nicht sein.
RalphFFM
 2008-01-20 20:08
#104950 #104950
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Eigentlich soll das Package gar nicht wissen müssen wie die Variable heißt.
Das Package soll quasi im Namespace des .pl-Skriptes ausgeführt werden.
betterworld
 2008-01-20 20:10
#104951 #104951
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
RalphFFM+2008-01-20 19:08:06--
Eigentlich soll das Package gar nicht wissen müssen wie die Variable heißt.

Wie soll es sie dann benutzen?
murphy
 2008-01-20 20:14
#104952 #104952
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Huh? Wenn das Package den Variablennamen nicht kennt, kann es ja wohl schlecht auf die Variable zugreifen!

Oder suchst Du vielleicht eher nach einer Lösung, das Package etwas ausführen zu lassen, was im Skript definiert ist? Dafür solltest Du dann Closures verwenden.
When C++ is your hammer, every problem looks like your thumb.
RalphFFM
 2008-01-20 20:17
#104954 #104954
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das Package soll im Wesentlichen nur eine Variablenersetzung machen.
Code (perl): (dl )
$temp =~ s/(\$\w+)/$1/eeg;

Dadezu musses aber den Skript-Namespace haben. Danke für jeden Tip.
renee
 2008-01-20 20:36
#104956 #104956
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was ist denn das Ziel?
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-01-20 20:41
#104957 #104957
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Alles was wie eine Variable aussieht ($irgendwas) wird ersetzt mit der entsprechenden,
im globalen Namespace verfügbaren Variable. Mein zweiter Gedanke ist es die Routine
in ein eigenes Mini-Package auszugliedern. (Letzteres wäre aber nur nice to have.)
pq
 2008-01-20 20:49
#104960 #104960
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
RalphFFM+2008-01-20 19:17:47--
Das Package soll im Wesentlichen nur eine Variablenersetzung machen.
Code (perl): (dl )
$temp =~ s/(\$\w+)/$1/eeg;

nicht gut, nicht gut. zu deinem eigenen besten, überleg dir eine andere strategie.
nimm statt einer globalen variable einen hash.
es ist sicher auch mit einer globalen variable zu lösen, aber das wird dir
später nur kopfschmerzen bereiten, glaub mir. zumal es schon eklig
ist, in einem modul eine globale variable von aussen zu benutzen - halbwegs
akzeptabel ist es, von aussen eine package-variable zu setzen (wie z.b.
$Data::Dumper::Sortkeys = 1).
ausserdem ist eine globale variable (in deinem fall wohl eine package variable
aus main::) auch nix anderes als ein hash-eintrag (der hash ist in dem fall die
symboltabelle des packages).
also, warum muss es unbedingt eine globale variable sein?
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
RalphFFM
 2008-01-20 20:57
#104961 #104961
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Es muß nicht zwingend eine globale Variable sein. Einen Hash übergeben,
hmm stimmt, ja das ist mir irgendwie gerade nicht eingefallen. Müßte ja
eigentlich theoretisch funktionieren. Muß noch nachdenken was sich dadurch
alles ändert.
<< >> 10 Einträge, 1 Seite



View all threads created 2008-01-20 19:56.