[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