Schrift
[thread]7019[/thread]

probleme mit symbolischen Referenzen: symbolische Referenzen



<< >> 4 Einträge, 1 Seite
mama
 2005-05-29 18:23
#55157 #55157
User since
2005-05-29
3 Artikel
BenutzerIn
[default_avatar]
Hey,

ich schreibe gerade an einem modul, in dem an eine funktion eine variable mit folgendem aussehen uebergeben wird: teil1.teil2.teil3 usw, die laenge ist beliebig.
Die einzelnen teile der uebergebenen variable sind in einem hash eines objektes gespeichert, also so:
$object_ref->{'config_tree'}{'teil1'}{'teil2'}{'teil3'} usw, haengt vom uebergebenen parameter ab. config_tree wird immer vornedrangehaengt.

um den wert im hash zu erreichen, habe ich folgende funktion:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub name_of_conf
{
my $p = shift; #die objektreferenz
my $path = shift;
my @name = split /\./, $value;
print "In name_of_conf: name = @name\n";

my $varname = '{"config_tree"}';
while( shift @name ) {
$varname .= "{\"" . "$value" ."\"}";
}

print "\t\tVarname = $varname,\tValue: $value,\t";
print "dereferenced: " . $p->$varname . "\n";

return $varname;
}

Ich habe hier also einen symbolischen link, der eigentlich funktionieren muesste.

wenn ich non das skript ausfuehre, kommt mir folgendes:
Can't locate object method "{"config_tree"}{"table"}" via package ...

dabei habe ich nur table als parameter uebergeben, und die funktion so aufgerufen:
$object_ref->name_of_conf( "table" );


Danke\n\n

<!--EDIT|mama|1117376766-->
mama
 2005-05-29 19:17
#55158 #55158
User since
2005-05-29
3 Artikel
BenutzerIn
[default_avatar]
sry, habe gerade herausgefunden, dass symbolische referenzen nur fuer globale variablen gehen,
meine objektreferenz ist aber lexically scoped( deutsches wort, weiss nicht)
betterworld
 2005-05-30 12:45
#55159 #55159
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wahrscheinlich hilft Dir "eval" weiter.
sri
 2005-05-30 14:16
#55160 #55160
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das hat ueberhaupt nichts mit scoping zu tun.

Code: (dl )
$obj->$method # Das ist einfach ein methodenaufruf!


Und um himmelswillen kein eval fuer so nen Kleinkram!

Lieber sowas in der Art:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
sub name_of_conf {
   my ( $self, $path ) = @_;
   
   my $child = $self->{config_tree};
   for my $name ( split /\./, $path ) { $child = $child->{$name} }
   
   print "$path: $child";
   
   return $child;
}
<< >> 4 Einträge, 1 Seite



View all threads created 2005-05-29 18:23.