[Munich-pm] sort mit curried function
Rouchal, Marek
marek.rouchal at intel.com
Mo Nov 19 03:01:03 PST 2012
Hi Robert,
ich schaetze, das liegt daran, dass $a/$b nur im Kontext von sort etwas bedeuten.
Versuch's mal so:
sub bykey {
my $key = shift;
return(sub {$_[0]->{$key} <=> $_[1]->{$key}});
}
und weiter oben:
foreach my $h (sort { &$byx($a,$b) } @liste){
print $h->{x}, $h->{y}, "\n";
}
Gruss,
Marek
-----Original Message-----
From: Munich-pm [mailto:munich-pm-bounces+marek.rouchal=intel.com at pm.org] On Behalf Of Robert C. Helling
Sent: Monday, November 19, 2012 11:06 AM
To: munich-pm at pm.org
Subject: [Munich-pm] sort mit curried function
Hallo,
ich stehe grade mal wieder auf dem Schlauch. Ich habe eine Liste mit Hashreferenzen, wobei die Hashes mehrere Felder vom gleichen Typ haben.
Nun moechte ich gerne die Liste sortieren anhand jeweils eines Feldes des Hashes. Die Vergleichsfunktion ist etwas kompliziert. Daher will ich sie nicht fuer jedes Hashfeld neu schreiben, sondern mach lieber eine gemeinsame Vergleichsfunktion, die den Namen des Feldes bekommt und dann entsprechend gecurried wird. Schematisch wie in diesem Beispiel:
#!/usr/bin/perl -w
use strict;
my @liste = ({ x => 1, y => 4}, {x => 3, y => 2});
my $byx = &bykey('x');
foreach my $h (sort $byx @liste){
print $h->{x}, $h->{y}, "\n";
}
sub bykey {
my $key = shift;
return(sub {$a->{$key} <=> $b->{$key}}); }
Das funktioniert so. Meine Frage ist nun: Wie komme ich ohne die Dummyvariable $byx aus? Ich habe zB schon probiert
foreach my $h (sort &&bykey('x') @liste){
aber das gibt einen Syntaxerror. Auch aehnliche Versionen mit weniger &'s und mehr oder wenigen Klammern verschiedenen Typs habe ich probiert, aber nichts davon funktionierte.
Wer erleuchtet mich?
Viele Gruesse
Robert
--
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oO
Robert C. Helling Elite Master Course Theoretical and Mathematical Physics
Scientific Coordinator
Ludwig Maximilians Universitaet Muenchen, Dept. Physik
print "Just another Phone: +49 89 2180-4523 Theresienstr. 39, rm. B339
stupid .sig\n"; http://www.atdotde.de
_______________________________________________
Munich-pm mailing list http://munich.pm.org/ Munich-pm at pm.org http://mail.pm.org/mailman/listinfo/munich-pm
Mehr Informationen über die Mailingliste Munich-pm