Hallo Forum,
Vor einiger Zeit kam ich auf die Idee, mir ein Modul zu schreiben, mit dem ich an beliebigen Stellen meiner Skripte, Variablen bzw. deren Zustände ausgeben kann.
Mit Typeglobs funktionierte das auch in der unten geposteten Konstellation auch ziemlich gut, und ergibt:
Variable: *main::name1
REF: SCALAR: wert;
Variable: *main::name2
REF: ARRAY: 0 => wert; 1 => value;
Variable: *main::name3
REF: HASH: eins => wert; zwei => value;
Jetzt habe ich LOG.pm in ein Modul eingebunden, das wiederum von einem Modul aufgerufen wird, welches in ein Skript eingebunden ist.
Wenn ich ,mit &Log(*variablenname); aufrufe, bekomme ich nur den Variablennamen ausgegeben:
Variable: *modul::variablenname
aber nicht wie oben die zugehörigen Werte.
In beiden Modulen wird 'use strict;' verwendet. (Den Code spar ich mir hier mal, stelle aber eine Version davon online: http://www.twoforyou.de/test/csv.txt ab Zeile 274, ist markiert, und bitte nicht lachen ;-))
Wieso funktioniert nun der Aufruf aus testlog.cgi, aber nicht mehr aus dem Modul, obwohl die im Modul mit print() ausgegebenen Variablen die korrekten Werte aufweisen?
Habe ich irgendwas übersehen, oder muss ich noch irgendetwas anderes beachten? Sehe ich vielleicht nur den Unterschied zwischen meinem Modul und dem Skript vor lauter Code nicht mehr?
Schon mal vielen Dank für etwaige Hinweise.
Gruß AlexBausW
P.S.: Die Übergabe des Filehandles (LOG) als Typeglob an &_resolveRefs() habe ich schon mal erfolglos getestet :-(
P.P.S.: Ich hoffe das ist nicht zuviel Code :-)
#============================
LOG.pm
package LOG;
use strict;
Typeglob LOG als Modulvariable
use vars qw(*LOG);
#***********************************************
Schreibt Bezeichner und Werte in Logdatei
sub Log {
# uebergebene Typeglobs in Array speichern
my @log = @_;
# Logdatei oeffnen
open (LOG, ">>$logfile") die "Can`t append to $logfile: $!";
flock (LOG,2) unless $^O =~ /win/i;
# Variablen schreiben
foreach (@log) {
print LOG " Variable: ",$_,"\n";
# Typeglob ist Scalar
if ( ${$_} ) {
&_resolveRefs(${$_});
}
.
. # Hier ist der Code fuer Arrays und Hashs
.
}
close LOG;
}
}
#********************************
loest Referenzen rekursiv auf
sub _resolveRefs {
# Paramterreferenz
my $ref = shift;
# Referenz ist Skalar
if (ref($ref) eq "SCALAR") {
print LOG "SCALAR: ";
&_resolveRefs(${$ref});
}
.
. # Hier ist der Code fuer Arrays und Hashs
.
# Referenz ist Referenz
elsif (ref($ref) eq "REF") {
print LOG "REF: ";
&_resolveRefs(${$ref});
}
# Ausgabe des Werts der Variablen
else { print LOG $ref,"; "; }
}
#==================================
testlog.cgi
use LOG;
$scalar = "wert";
@array = ("wert","value");
%hash = ('eins' => "wert", 'zwei' => "value");
&Sub($scalar,@array,%hash);
sub Sub {
($name1,$name2,$name3) = @_;
&Log(*name1, *name2, *name3);
}