linux-l: perl-hashs mit dynamischen Variablen

Steffen Dettmer steffen at dett.de
Fr Feb 9 11:39:48 CET 2001


* Ulrich Wiederhold wrote on Fri, Feb 09, 2001 at 10:17 +0100:
> Ich habe ein hash, bei dem einem key entweder ein Skalar oder mehrere
> Werte als Referenz-Array zugeordnet sind.

also %hash = { 'key1' => 'hallo', 
               'key2' => [ "1", "2" ] } 
oder wie?

> Dieses Values möchte ich nun in Skalare und Arrays schreiben, die aus
> dem Key generiert werden.
> 
> Also, wenn $value($key) = Referenz, 

$value{$key} = array ref? ja?

> dann speichere value[i] in '$' .
> '$key' . '[' . $i . ']', 

also z.B. $key1[i] = "1"; usw.?
Warum nicht gleich
$key1 = $hash{'key1'}?
Dann geht $key->[1] oder @$key

Mußt Du wirklich symbolische Referenzen verwenden?

> wenn keine Referenz (sondern Skalar), dann
> speichere '$' . '$key' = $value.

das macht getopts so. Da kann man mal in den Source schauen. Ich
schätze, die verwenden globs.

> Dazu benötige ich wohl "eval". 

Wieso?!

> Ideen? Es geht um die 2 Zeilen mit eval, der Rest funzt und in dem hash
> ist auch alles ok.
> 
> Im Perl-Text sieht das dann so aus:
>  while (($key, $value) = each(%config)) {
>       $i = 0;
>       if (ref $value) {
> 	  while ($i <= $#{$config{$key}}) {
>     	      eval"'\$' . '$key' . '[' . $i . ']' = ${$config{$key}}[$i]}";
	      @$key = @{$config{$key}};
> 	      $i++;
>             }
> 	} else {
>  	  eval "'\$' . '$key' = $config{$key}";
          $$key = $config{$key};  	 
>       }	
>  }

Untested. Als Beispiel hatte ich:

steffen at dx:~ > perl -e '
$var = "b";        #name of symbolic ref is "b"
$a = [ "1", "2"]; 
@$var = @$a;       #use symbolic ref 
print join(",", @b), "\n";
'

Ausgabe:

1,2

Ich würde aber lieber richtige Referenzen Verwenden.

oki,

Steffen

-- 
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.



Mehr Informationen über die Mailingliste linux-l