perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 33
Click for quality!




10.02.2012 / 09:13

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragVariabler 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

Beitragre: 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

Beitragre: 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

Beitragre: Variabler Variablenname
Seitenanfang
Nach dem "Hash im Hash im Hash" fehlt ein "sind". Doof :o)

Datum: 19.05.2007-10:42

Beitragre: 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

-






-
-