PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: Zugriff auf Arrayelemente von Hashes



Stefan Feeser
02-06-2006, 12:32
Hallo zusammen,

ich möchte auf Elemente eines in einem Hash referenzierten Array zugreifen und diese abändern. Ich bin mir bei der Referenzierung noch nicht ganz sicher, wenngleich ich denke, dass mir der Sinn (man vergibt den Schlüssel eines Hashs und läßt den Wert auf ein Array zeigen > Pointer <) klar ist.

Hier also Codefragmente wie ich den Hash/das referenzierte Array fülle:


open (BB, $str_pfad_bb) or die "Konnte die Datei $str_pfad_bb nicht oeffnen: $!\n";
while (<BB>) {
chomp;
@arr_hilf = split /;/,$_;
$str_isin = $arr_hilf[0];
$str_waehrung = $arr_hilf[1];
$str_nominal = $arr_hilf[2];
push( @{$hsh_liste_bb{$str_isin}},$str_waehrung );
push( @{$hsh_liste_bb{$str_isin}},$str_nominal );
push( @{$hsh_liste_bb{$str_isin}},$int_mtch_isin );
push( @{$hsh_liste_bb{$str_isin}},$int_mtch_whrg );
push( @{$hsh_liste_bb{$str_isin}},$int_mtch_nom );
}
close BB;


Ich wuerde nun gerne die vorher gefüllten Elemente, z. B. $int_mtch_isin von ursprünglich 0 auf 1 abaendern. Kann mir hier jemand weiterhelfen?

Gruß und Danke

Stefan

Romanday
02-06-2006, 23:22
Ich wuerde nun gerne die vorher gefüllten Elemente, z. B. $int_mtch_isin von ursprünglich 0 auf 1 abaendern. Kann mir hier jemand weiterhelfen?

Gruß und Danke

Stefan


$int_mtch_isin = 1; # Sollte reichen

michael.sprick
03-06-2006, 12:02
use strict;
use warnings;
use Data::Dumper;

# sowas hast Du in etwa nach dem Einlesen Deiner Werte:
my %Hash=();
push(@{$Hash{'key1'}},'element1');
push(@{$Hash{'key1'}},'element2');
push(@{$Hash{'key1'}},'element3');
push(@{$Hash{'key2'}},'element1');
push(@{$Hash{'key2'}},'element2');
push(@{$Hash{'key2'}},'element3');

print Dumper \%Hash;

# Um nun bestimmte Daten zu ändern, musst Du dereferenzieren, so:
$Hash{'key1'}->[2] = 'ein neuer Wert';
print Dumper \%Hash;

# oder so:
@{$Hash{'key1'}}[2] = 'wieder ein neuer Wert';
print Dumper \%Hash;

siehe dazu auch perldoc perlref ;)

Wichtig ist evtl. noch, dass push() das neue Element immer hinten an die Liste hängt. Sollte die Anzahl der Arrayelemente nicht bei jedem Datensatz identisch sein, kannst Du später nicht mehr sicherstellen, dass sich hinter dem Index[4] auch wirklich der Wert befindet, den Du erwartest.

In dem Fall empfiehlt sich dann vermutlich eher die Verwendung eines HashOfHashes statt eines HashOfArrays...

hth, Michael

Stefan Feeser
05-06-2006, 12:27
Hallo Ihr Beiden,

vielen Dank für die Infos. Ich denke, dass die Antwort von Michael genau das ist, was ich brauche.

Gruss

Stefan

Thomas Engelke
14-06-2006, 09:03
Kurz noch zur Effektivität (macht dasselbe wie dein Code):


open (BB, $str_pfad_bb) or die "Konnte die Datei $str_pfad_bb nicht oeffnen: $!\n";
while (<BB>) {
chomp;
($str_isin,$str_waehrung,$str_nominal,$rest) = split/;/;
push(@{$hsh_liste_bb{$str_isin}},($str_waehrung,$s tr_nominal,$int_mtch_isin,$int_mtch_whrg,$int_mtch _nom));
}
close BB;

Perl kann ja sehr effektiv programmiert werden. Natürlich ist das alles eine Frage des Verständnisses und dein Code ist einfacher zu lesen. Allerdings gibt man meiner Meinung nach auch einen Teil der Mächtigkeit von Perl auf, wenn man seine "Emphatie" nicht nutzt.

Romanday
14-06-2006, 11:36
Kurz noch zur Effektivität (macht dasselbe wie dein Code):

Allerdings gibt man meiner Meinung nach auch einen Teil der Mächtigkeit von Perl auf, wenn man seine "Emphatie" nicht nutzt.

Jeder will der Beste sein.:D

Stefan Feeser
16-06-2006, 08:20
Hi,

das man besser alle Elemente des Arrays auf einmal hinzufügt um effizienter Code zu erhalten verstehe ich. Was ist aber "Emphatie":confused: . Könnt Ihr das vielleicht mal kurz erklären/definieren?

Gruß

Stefan

Thomas Engelke
21-06-2006, 14:17
das man besser alle Elemente des Arrays auf einmal hinzufügt um effizienter Code zu erhalten verstehe ich. Was ist aber "Emphatie":confused: . Könnt Ihr das vielleicht mal kurz erklären/definieren?

Der Satz "Perl ist nicht wie andere Sprachen" ist wahrscheinlich, obwohl man die meisten Sprachen einsetzen kann, fast für Perl erdacht worden. Ich will da nicht zu sehr in's Detail gehen. Perl ist z.B. üblicherweise sehr gut darin, dir zu sagen, was du eigentlich machen wolltest, wenn du beispielsweise Fehler in deinem Quelltext hast.

Vieles an Perl ist leicht mystisch angehaucht, was meist auf seinen Erfinder Larry Wall zurückzuführen ist. Nur Perl-Entwickler laufen mit einem leichten Grinsen auf dem Gesicht herum. Und meine Kollegen gehen immer wieder verblüfft aus meinem Raum, wenn ich in Perl mal wieder in 7 Zeilen gelöst habe, wofür sie sonst 3 Stunden gebraucht hätten.

Bei Bedarf: Ein paar Zitate (http://en.wikiquote.org/wiki/Larry_Wall) von Larry.

TME