|
|
 |

|

 |

| Community » Perl: Allgemeines Forum |
|
Variabler Variablenname
|
Seitenanfang |
| Wie kann ich in Perl variable Variablenname erstellen bzw. auf eine dynamisch erstellte Variable zugreifen? Folgende Struktur: In meinem kleinen Skript habe ich ein paar Konfigurationshashes angelegt. Diese haben unterschiedliche Namen. %programm_1_conf = { ... }; %programm_2_conf = { ... }; Diese Hashes sollen durch eine Schleife, die sich in einer Subroutine befindet, ausgelesen werden. Der Programmname soll dabei aber an die Subroutine übergeben werden, um die Schleife nur einmal erstellen zu müssen. So sieht das in etwa aus: # Subroutine zum auslesen des Hash sub programm_conf_auslesen { # Den Programmname, der als Parameter # übergeben wurde auslesen. my $programm = @_[0]; # Die Schleife foreach my $programm_conf (keys %{?$programm_conf?}( } } Der Aufruf, der zwischen den ? ? funktioniert natürlich nicht, hier liegt auch das Problem. Ich möchte eben mit einer Schleife auf die beiden Hashes zugreifen können. Danke schonmal :o)
Datum: 18.05.2007-19:49

|
re: Variabler Variablenname
|
Seitenanfang |
Verwende einfach ein Hash of Hashes my %config = ( programA => { key1 => 'val1', key2 => 'val2', # ... }, programB => { key1 => 'val1', key2 => 'val2', # ... }, # ... );
Der Zugriff erfolgt so
my $value = $config{'programA'}->{'key2'};
Es laesst sich auch der Wert einer Variablen als Variablenbezeichner oder Teil eines Variablenbezeichners verwenden, ist aber schlechter Programmierstil, besser ist die Verwendung von Hashes. Eine Sache noch
my $programm = @_[0];
das '@' ist an dieser Stelle falsch. Wenn du auf das gesamte Array zugreifst dann verwendest du das '@', greifst du jedoch auf ein Element des Arrays (also einen Skalarwert) zu dann setzt du '$' vor den Bezeichner.
my $program = $_[0];
Datum: 19.05.2007-10:09

|
re: Variabler Variablenname
|
Seitenanfang |
| Danke erstmal für deine Antwort. Das mit dem @ und $ werf ich komischerweise ganz gern mal durcheinander. Das mit dem Hash im Hash hatte ich mir auch schon überlegt, aber das Problem ist, dass meine Hashes für die Konfiguration bereits "Hash im Hash im Hash" und ich auch schon an vielen Ecken darauf zugreife. Sehe ich das richtig, dass ich, um mit deiner Lösung arbeiten zu können meine ganzen Hashaufrufe umändern muss, weil es ja dadurch eine Ebene tiefer geht,...!? Wäre schon sehr mühsam ;-)
Datum: 19.05.2007-10:41

|
re: Variabler Variablenname
|
Seitenanfang |
| Nach dem "Hash im Hash im Hash" fehlt ein "sind". Doof :o)
Datum: 19.05.2007-10:42

|
re: Variabler Variablenname
|
Seitenanfang |
-----8<----- Danke erstmal für deine Antwort. Das mit dem @ und $ werf ich komischerweise ganz gern mal durcheinander. ----->8----- Mit aktivierten 'strict' und 'warnings' wirst du darauf hingewiesen. -----8<----- Sehe ich das richtig, dass ich, um mit deiner Lösung arbeiten zu können meine ganzen Hashaufrufe umändern muss, weil es ja dadurch eine Ebene tiefer geht,...!? ----->8----- Nicht unbedingt, hier ein Stueck Code dass das veranschaulicht.
#!/usr/bin/perl use strict; use warnings; my $programA = { key1 => 'val1', key2 => 'val2', }; my $programB = { key1 => 'val1', key2 => 'val2', }; sub fu_bar { $programA->{'key2'} = 'abc'; }
my %config = ( programA = { key1 => 'val1', key2 => 'val2', }, programB = { key1 => 'val1', key2 => 'val2', }, );sub fu_bar { my $programA = $config{'programA'}; $programA->{'key2'} = 'abc'; }
Wie du siehst, die Definition der globalen Variablen $programA und $programB wurden einfach in den Hash verlegt und in den Abschnitt in dem die Variable $programA benoetigt wird, wird sie einfach am Anfang des Blocks lokal angelegt.
Datum: 20.05.2007-13:13

|
|

|

|

|
 |

|

|
|