[Munich-pm] sort mit curried function

Harald Joerg harald.joerg at ts.fujitsu.com
Mo Nov 19 06:16:22 PST 2012


Roderich Schupp schreibt:

> 2012/11/19 Harald Joerg <harald.joerg at ts.fujitsu.com>
>
>        * In bykey sind $a und $b direkt verfügbar, das sind package globals
>
>          Es ist aber nicht nötig, eine eigene Subroutine zu erzeugen.
>          (@Roderich: Geht nicht - gibt's nicht :))
>
>
> Es funktioniert nur wegen diesem gruseligen Hack, dass $a und $b
> global sind.

Na ja, der gruselige Hack ist Perl-Tradition.  Sowas akzeptiere ich
stillschweigend und achselzuckend.  Du kannst das meiner Altersmilde
zurechnen.

> Ich würde jeden blacklisten, der so was verwendet - einzige Ausnahme,
> wenn $a und $b textuell im Block stehen.
> Gedankenexperiment: Was passiert, wenn vor sub bykey { ... }
>
> my $a = { foo => 0 };
>
> eingefügt wird?

Perl-Programmierer *wissen*, was passiert, wenn man so eine Zeile in die
Nähe einer Sortierroutine einfügt.  So schwarz-weiß sehe ich die Welt da
nicht.  Ich würde genauso davon abraten, in einem Perl-Programm die
Variablen $a und $b überhaupt selbst zu definieren, eben genau aus
Respekt vor der Tradition.

Wenn Du's $a/$b-lokal kriegen willst, schreibst Du's so:
----------------------------------------------------------------------
#!/usr/bin/perl -w

use strict;

my @liste = ({ x => 1, y => 4}, {x => 3, y => 2});

foreach my $h (sort {bykey($a,$b,'x')} @liste) {
     print $h->{x}, $h->{y}, "\n";
}

sub bykey {
     my ($aa,$bb,$key) = @_;
     return($aa->{$key} <=> $bb->{$key});
}
----------------------------------------------------------------------

...aber mir ging es eigentlich darum, einen Weg zu zeigen, dass man ohne
dynamisch generiertes sub das Problem lösen kann.
-- 
Pax?
haj


Mehr Informationen über die Mailingliste Munich-pm