Jörk Behrends: Typgeglobs ausgeben und dereferenzieren?

Beitrag lesen

Hallo Alex,

Wenn ich ,mit &Log(*variablenname); aufrufe, bekomme ich nur den Variablennamen ausgegeben:
  Variable: *modul::variablenname
aber nicht wie oben die zugehörigen Werte.

Das ganze hat hier wohl nichts mit Deiner vermodularisierung zu tun! Ich denke Dein Problem ist hier, daß Du $primkey per my definiert hast. Dies hat zur Folge, daß $primkey überhaupt nicht in der "symbol table" gelistet wird!!! *primkey steht aber nur für alle Einträge von [$@%*]primkey aus eben dieser Tabelle. Eine Möglichkeit dies zu umgehen, wäre $primkey aus der my-Klammer herauszunehmen und separat per local($primkey); zu defininieren ...

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;
   }
}

Deine Überprüfung auf Scalar und wohl auch die anderen Varianten finde ich ein wenig riskant. Sollen leere Variablen z.B. nicht ausgegeben werden?
    # Typeglob ist Scalar
    if (definded *{$_}{SCALAR}) {
      &_resolveRefs(*{$_}{SCALAR});
    }
    # Typeglob ist für Array
    if (definded *{$_}{ARRAY}) {
      &_resolveRefs(*{$_}{ARRAY});
    }
    ...

Das ganze schimpft sich *foo{THING} Syntax. Näheres dazu unter "perldoc perlref".

Gruß,
    Jörk