Schrift
[thread]8855[/thread]

hash sortieren

Leser: 5


<< >> 7 Einträge, 1 Seite
Froschpopo
 2007-03-20 18:06
#75181 #75181
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Hab nen hash:

Code: (dl )
my %hash = (nummer => ['bla', 3]);


wie kann ich jetzt den hash nach $hash->[1] sortieren?

sort { $a->[1] <=> $b->[1] } klappt irgendwie nicht.
renee
 2007-03-20 18:25
#75182 #75182
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
was soll $hash->[1] sein? Meinst Du vielleicht das hier:
Code: (dl )
1
2
3
4
5
my %hash = (nummer => ['bla', 3], test => ['bla', 1] );

for my $key( sort{$hash{$a}->[1] <=> $hash{$b}->[1]}keys %hash ){
print $key,"\n";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Linuxer
 2007-03-20 20:43
#75183 #75183
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Hi,

das was Du da aufzeigst sind zwei verschiedene Dinge. Einmal ein Hash %hash und einmal eine Array-Referenz $hash, die Du dereferenzierst, um das Element 1 des referenzierten Arrays zu erhalten.

Code: (dl )
sort { $a->[1] <=> $b->[1] } 


Das kann nicht klappen, weil Du nicht angibst, was denn eigentlich sortiert werden soll.\n\n

<!--EDIT|Linuxer|1174416418-->
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!
kristian
 2007-03-20 20:43
#75184 #75184
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo

Code: (dl )
1
2
3
4
5
6
7
8
9
kristian@wst1:~> perl -wle '
my %hash = (nummer => ["bla", 3], test => ["bla", 1] );
my @sorted_keys = map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$_, $hash{$_}->[1] ] } keys %hash;
print $_ . " => " . $hash{$_}->[0] . " => " . $hash{$_}->[1] for @sorted_keys;
'
test => bla => 1
nummer => bla => 3

Code: (dl )
1
2
3
4
5
6
7
8
9
kristian@wst1:~> perl -wle '
my %hash = (nummer => ["bla", 3], test => ["bla", 1] );
my @sorted_keys = map { $_->[0] }
sort { $b->[1] <=> $a->[1] }
map { [$_, $hash{$_}->[1] ] } keys %hash;
print $_ . " => " . $hash{$_}->[0] . " => " . $hash{$_}->[1] for @sorted_keys;
'
nummer => bla => 3
test => bla => 1


Gruss
Kristian
Taulmarill
 2007-03-21 18:11
#75185 #75185
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Code: (dl )
my @sorted_keys = sort{$hash{$a}->[1] <=> $hash{$b}->[1]} keys %hash;

finde ich irgendwie einfacher als da noch zwei mal map rumzubasteln. Oder hat deine herangehensweise noch einen weniger offensichtlichen Vorteil?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
pq
 2007-03-21 18:29
#75186 #75186
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich denke auch, dass in dem fall eine schwartzian transform etwas overkill ist. hash-zugriffe
sind ja eigentlich recht schnell.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
kristian
 2007-03-22 09:55
#75187 #75187
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo

Quote
finde ich irgendwie einfacher als da noch zwei mal map rumzubasteln. Oder hat deine herangehensweise noch einen weniger offensichtlichen Vorteil?


Es ist wie pq schon sagte für diesen Fall absolut overkill.
Sinn macht es bei wirklich grossen Datenmengen, wenn man nach mehreren Kriterien sortieren will und / oder wenn eines dieser Kriterien erst durch eine Funktion zu ermitteln ist. Das will man dann auf keinen Fall im sort{} - Teil tuen, da der sehr oft aufgerufen wird.

Gruss
Kristian
<< >> 7 Einträge, 1 Seite



View all threads created 2007-03-20 18:06.