2015-09-08T17:49:42
biancaIch würde gern ein Array of Hashes nach einem bestimmten Key sortieren und diesen Key dabei gleich löschen, da er nur hilfsweise für die Sortierung dient.
Da das Array eventuell etwas größer werden könnte möchte ich das so ressourcenschonend wie möglich machen.
Im Moment sieht das so aus:
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
use strict;
use warnings;
my @unsortiert = (
{
name => 'alpha',
sorter => 2,
test => 'I',
},
{
name => 'beta',
sorter => 1,
test => 'II',
},
);
my @sortiert;
foreach my $tmp (sort {$a->{sorter} <=> $b->{sorter}} @unsortiert) {
delete $tmp->{sorter};
push @sortiert,{%$tmp};
}
use Data::Dumper;
print Dumper(\@sortiert);
Daran gefällt mir insbesondere nicht, dass ich zwei Arrays im Speicher habe.
Ich würde es gern bei einem belassen aber wie kann ich dieses sortieren und gleichzeitig den Hilfs-Key "sorter" löschen?
Danke
Wenn ich es richtig sehe, hast Du sogar drei Arrays gleichzeitig im Speicher:
@unsortiert, das Ergebnis der Sort-Operation und
@sortiert.
Allerdings ist das wahrscheinlich nicht mal halb so schlimm wie Du denkst, weil die Arrays nur Referenzen auf die Hashes speichern. Die Hashes selbst sind jeweils nur einmal gespeichert.
Falsch: die Hashes sind zweimal im Speicher, weil Du sie mit
{%$tmp} kopierst. Wenn es Dir auf Speicherplatz ankommt, ändere die Zeile als erstes auf
push @sortiert, $tmp;.
Ansonsten kannst Du Benchmarks fahren, ob eine der folgenden Pipe-Lösungen effizienter ist:
my @sortiert = map {delete $_->{sorter}} sort {$a->{sorter} <=> $b->{sorter}} @unsortiert;
oder - das Array ist hier nur zwei mal im Speicher -
@array = sort {$a->{sorter} <=> $b->{sorter}} @array;
@array = map {delete $_->{sorter}} @array;
Last edited: 2015-09-08 20:47:42 +0200 (CEST)