Thread Größten Wert in mehrstufigem Hash finden
(20 answers)
Opened by Stefan_S at 2018-03-15 09:46 Quote Genau das ist der Punkt. Die gewählte Datenstruktur ist ungünstig. Wie hlubenow in Größten Wert in mehrstufigem Hash finden schrieb: hlubenow Überlege Dir vorher, was genau Du mit den Daten vorhast und richte Dir dann auf der Basis die Datenstruktur ein. Möglichkeiten dafür gibt es verschiedene. Du musst nur eine passende für Deinen Einsatz finden ;-) Anstatt: Code (perl): (dl
)
1 2 3 4 5 $tc_artikel{$tc_timestamp}->{$tc_artikel_id}->{$tc_charge_id} = { artikel_nr => $tc_artikel_nr, bestand => $tc_chargenbestand, charge => $tc_charge, } könnte man beispielsweise so eine Struktur aufbauen: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 my $separator = "x"; my $artikel_charge = $tc_artikel_id . $separator, $tc_charge_id; push @{ $tc_artikel { $artikel_charge } }, { artikel_nr => $tc_artikel_nr, bestand => $tc_chargenbestand, charge => $tc_charge, }; Damit solltest Du einen Hash-Of-Arrays erhalten: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 '2111x10' => [ { 'artikel_nr' => 'AGI15030', 'bestand' => '3120.00', 'charge' => 'RSG' }, { 'artikel_nr' => 'AGI15030', 'bestand' => '3150.00', 'charge' => 'RSG' }, { 'artikel_nr' => 'AGI15030', 'bestand' => '3110.00', 'charge' => 'RSG' }, ], '2111x3' => [ { 'artikel_nr' => 'AGI15030', 'bestand' => '1450.00', 'charge' => 'Event Management' }, { 'artikel_nr' => 'AGI15030', 'bestand' => '1100.00', 'charge' => 'Event Management' }, ], Beispiel: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 #! /usr/bin/env perl use strict; use warnings; use 5.010; use Data::Dumper; my %tc_artikel = ( '2111x10' => [ { 'artikel_nr' => 'AGI15030', 'bestand' => '3120.00', 'charge' => 'RSG' }, { 'artikel_nr' => 'AGI15030', 'bestand' => '3150.00', 'charge' => 'RSG' }, { 'artikel_nr' => 'AGI15030', 'bestand' => '3110.00', 'charge' => 'RSG' }, ], '2111x3' => [ { 'artikel_nr' => 'AGI15030', 'bestand' => '1450.00', 'charge' => 'Event Management' }, { 'artikel_nr' => 'AGI15030', 'bestand' => '1100.00', 'charge' => 'Event Management' }, ], ); # zeige den jeweils hoechsten Bestand an: for my $artikel_charge ( keys %tc_artikel ) { my $max = ( sort { $b->{bestand} <=> $a->{bestand} } @{ $tc_artikel{ $artikel_charge } } )[0]; # split wenn man artikel und charge id wieder separat braucht #my ( $art_id, $chg_id ) = split m{x}, $artikel_charge; say $artikel_charge, "\n", Dumper( $max ); } __END__ Last edited: 2018-03-15 19:45:24 +0100 (CET) meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |