Font
[thread]7484[/thread]

Array of Hash nach Hashvalue sortieren



<< |< 1 2 >| >> 13 entries, 2 pages
jemand
 2005-11-20 11:56
#60254 #60254
User since
2004-05-14
231 articles
BenutzerIn
[default_avatar]
Hallo,
ich habe ein Array of Hash(bzw. Array of Reference to Hash), das ich nach den Werten eines bestimmten Hashkeys sortieren möchte.

Also mehr oder weniger:

@array = ({foo => 'erde',
bar => 'himmel'
},
{foo => 'wasser',
bar => 'luft'
},
{foo => 'blubb',
bar => 'bla'
}
);

Nach den Values von foo sortiert soll hier dann rauskommen:

@neues_array = ({foo => 'blubb',
bar => 'bla'
},
{foo => 'erde',
bar => 'himmel'
},
{foo => 'wasser',
bar => 'luft'
}
);

Natürlich hab ich mir schon selbst Gedanken gemacht bevor ich euch hier bemüh:
Ich könnte die Werte von foo in ein Array schmeißen sortieren, dann dieses Array durchlaufen lassen und und jeweils schauen lassen in welchem Hash die Value mit dem Arraywert übereinstimmt.

Da dies jedoch sehr kompliziert ist und wohl auch viel Zeit brauchen würde, wollte ich mal wissen ob das auch einfacher geht.
Ich dachte da so an eine eigene Sub für sort. Mein Problem dabei war aber, dass ich keine Ahnung habe, wie ich sort sage, dass es in das Array, das es zurückgibt, jeweils das ganze Hash tun soll und nicht nur die Value von foo.

Gruß Jemand

PS: Kann es sein, dass die Suchfunktion leicht kaputt ist?? Zumindest funktioniert das boolische UND nicht richtig.
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
renee
 2005-11-20 12:20
#60255 #60255
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my @array = ({foo => 'erde',
bar => 'himmel'
},
{foo => 'wasser',
bar => 'luft'
},
{foo => 'blubb',
bar => 'bla'
}
);

my @sorted = sort{$a->{foo} cmp $b->{foo}}@array;
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/
renee
 2005-11-20 12:21
#60256 #60256
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Die Suchfunktion vom ikonboard ist eher bescheiden... Man muss schon Glueck haben, ein richtig gutes Ergebnis zu bekommen...
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/
betterworld
 2005-11-20 15:17
#60257 #60257
User since
2003-08-21
2613 articles
ModeratorIn

user image
[quote=renee,20.11.2005, 11:21]Die Suchfunktion vom ikonboard ist eher bescheiden... Man muss schon Glueck haben, ein richtig gutes Ergebnis zu bekommen...[/quote]
Neuerdings sind wir ja aber anscheinend auch bei Google indiziert. Vielleicht sollten wir irgendwo mal einen Link auf http://www.google.com/custom?....nity.de hinsetzen.\n\n

<!--EDIT|betterworld|1132493452-->
J-jayz-Z
 2005-11-20 16:13
#60258 #60258
User since
2005-04-13
625 articles
BenutzerIn
[Homepage] [default_avatar]
Oder die google suchfunktion irgendwo einbauen hier, ist doch auch möglich
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
jemand
 2005-11-20 17:34
#60259 #60259
User since
2004-05-14
231 articles
BenutzerIn
[default_avatar]
Oke danke
Kann mir nebenbei noch jemand erklären warum meine lösung mit:

Code: (dl )
1
2
3
sub HashRefSort($$){
$$_[0]{'foo'} cmp $$_[1]{'foo'};
}


nicht funktioniert hat?

@Suche: Ich bin auch sehr dafür den Link im Suchenformular irgendwo hinzusetzen oder aber so ein Einbau-Entry. Oder wenigstens den Hinweis auf UND und ODER wegzumachen.

Edit: Code-Tags, Kann es sein dass es an den ' lag?\n\n

<!--EDIT|jemand|1132500926-->
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
pq
 2005-11-20 18:20
#60260 #60260
User since
2003-08-04
12207 articles
Admin1
[Homepage]
user image
[quote=jemand,20.11.2005, 16:34]Oke danke
Kann mir nebenbei noch jemand erklären warum meine lösung mit:

Code: (dl )
1
2
3
sub HashRefSort($$){
   $$_[0]{'foo'} cmp $$_[1]{'foo'};
}


nicht funktioniert hat?[/quote]
wieder ein gutes beispiel, warum man Perl Best Practices lesen sollte.
$$_[0]{foo} ist äquivalent zu $_->[0]->{foo}.
du meinst aber $_[0]->{foo}.
die syntax mit $$...ist nicht empfehlenswert.

ob da nun anführungszeichen um foo herum sind oder nicht, ist egal.

p.s.: und natürlich hätte dich perl gewarnt, hättest du warnings benutzt!
also, das nächste mal use warnings\n\n

<!--EDIT|pq|1132504544-->
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
jemand
 2005-11-20 21:36
#60261 #60261
User since
2004-05-14
231 articles
BenutzerIn
[default_avatar]
Danke,
ist das erste Mal dass ich wirklich im ganze Programm Referenzen hab die durch die Gegend fliegen. Da ist man schon mal verwirrt...

normalerweise nehm ich immer warnings und strict. Allerdings war das mal nur ein schnell geschriebenes Testskript, wobei ich eigentlich dachte dass es mit sort gar nicht funktionieren würde, da ich annahm sort würde das was es vergleicht in das array zurückgeben.

Gruß Jemand
print uc 'i',chr(29*4).q+'s +.++($_=q-m-),++$_;
print chr for 116,$_[0],97,$_[0],98;
print 'ug,',chr(), scalar reverse qq?!erutaef a s'ti?;
Dubu
 2005-11-20 23:08
#60262 #60262
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
[quote=jemand,20.11.2005, 20:36]normalerweise nehm ich immer warnings und strict. Allerdings war das mal nur ein schnell geschriebenes Testskript,[/quote]
Ja, das ist sie wieder, die No. 1 unter den Top 10 der Ausreden, warum man ohne strict und/oder warnings gearbeitet hat.  ;)
pq
 2005-11-21 02:07
#60263 #60263
User since
2003-08-04
12207 articles
Admin1
[Homepage]
user image
[quote=jemand,20.11.2005, 20:36]normalerweise nehm ich immer warnings und strict. Allerdings war das mal nur ein schnell geschriebenes Testskript[/quote]
man kann sich erstaunlich viel angewöhnen, bzw. seinem editor.
ich tippe bei einzeilern schon fast im schlaf "perl -wle", wobei da natürlich
noch das strict fehlt.
bei skripten habe ich ein alias für vim, das mir immer
Code: (dl )
1
2
3
#!/usr/bin/perl
use warnings;
use strict;

an den anfang schreibt. ich drücke nur eine einzige taste dafür.
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
<< |< 1 2 >| >> 13 entries, 2 pages



View all threads created 2005-11-20 11:56.