Zugriff über Pointer auf Hashes

04/01/2014 - 13:33 von mphak | Report spam
Hallo,

ich stehe schon seit Tagen vor folgendem Problem.

In meinem Programm gibt es mehrere Hashes. In meinem Beispiel 3.


my %vierer = (
"01,02,04,05",1,
"02,03,05,06",1,
"04,05,07,08",1,
);
my %dreier = (
"01,02,04",1,
"02,03,05",1,
"04,05,07",1,
);
my %sechser = (
"01,02,03,04,05,06",1,
"03,04,05,06,07,08",1,
"05,06,07,08,09,10",1,
);


Für jedes dieser Hashes gibt es verschiedene Funktionen, so dass ich diese Hashes auch nicht zusammenfassen kann.

Es gibt aber auch Funktionen, die auf alle Hashes angewand werden sollen.

z.B. Immer wenn in einem Schlüssel die "04" auftaucht, soll der Wert um 1 erhöht werden.

Ich habe das bisher so versucht zu lösen.

my $ref_vierer = \%vierer;
my $ref_dreier = \%dreier;
my $ref_sechser = \%sechser;

# Dereferenzierungen:
#${$ref_vierer}{'red'} = "Test";
my %Zusammen = (%$ref_vierer, %$ref_dreier, %$ref_sechser);
my $ref_Zusammen = \%Zusammen;

while(($schluessel, $wert) = each(%Zusammen))
{
if($schluessel =~ /.*04.*/)
{
${$ref_Zusammen}{$schluessel} = $wert + 1;
}
}


Lasse ich mir nun das Hash Zusammen ausgeben bekomme ich folgende Werte.
01,02,04,05 => 2
02,03,05,06 => 1
01,02,03,04,05,06 => 2
02,03,05 => 1
03,04,05,06,07,08 => 2
04,05,07 => 2
05,06,07,08,09,10 => 1
04,05,07,08 => 2
01,02,04 => 2


Die einzelnen Hashes haben aber weiterhin diese Werte
01,02,04,05 => 1
02,03,05,06 => 1
04,05,07,08 => 1

04,05,07 => 1
02,03,05 => 1
01,02,04 => 1

05,06,07,08,09,10 => 1
01,02,03,04,05,06 => 1
03,04,05,06,07,08 => 1

Nun versuche ich es hinzubekommen, dass auch in diesen Hashes die Werte geàndert werden.
Meine bisherigen Versuche sind leider erfolglos.
Habt ihr evtl. einen Tipp für mich. Wie ich das lösen kann?
Wàre euch dafür sehr dankbar.

Mit freundlichen Grüßen
 

Lesen sie die antworten

#1 Bjoern Hoehrmann
04/01/2014 - 16:06 | Warnen spam
* wrote in de.comp.lang.perl.misc:
# Dereferenzierungen:
#${$ref_vierer}{'red'} = "Test";
my %Zusammen = (%$ref_vierer, %$ref_dreier, %$ref_sechser);



Die Dereferenzierung erzeugt Kopien der Hashes.

my $ref_Zusammen = \%Zusammen;

while(($schluessel, $wert) = each(%Zusammen))
{
if($schluessel =~ /.*04.*/)
{
${$ref_Zusammen}{$schluessel} = $wert + 1;
}
}



Ich schlage mal vor,

for my $h (\%vierer, \%dreier, \%sechser) {
while(my ($schluessel, $wert) = each(%$h)) {
$h->{$schluessel}++ if $schluessel =~ /04/;
}
}
Björn Höhrmann · mailto: · http://bjoern.hoehrmann.de
Am Badedeich 7 · Telefon: +49(0)160/4415681 · http://www.bjoernsworld.de
25899 Dagebüll · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/

Ähnliche fragen