From mailinglisten at renee-baecker.de Tue Nov 6 00:32:45 2012 From: mailinglisten at renee-baecker.de (mailinglisten at renee-baecker.de) Date: Tue, 6 Nov 2012 09:32:45 +0100 Subject: [Munich-pm] Google Code-In: Aufgaben gesucht! Message-ID: <20121106_083245_009467.mailinglisten@renee-baecker.de> Hallo liebe Perlmongers, die Perl Foundation möchte wieder als Organisation beim "Google Code-In" mitmachen. Dazu werden Aufgaben gesucht, die die Schüler machen können. Vielleicht fällt euch noch etwas ein (z.B. Tests für eure Module auf CPAN schreiben ;-) ). Hier kommt noch die Mail von Mark Keating; auf den dort genannten Webseiten findet ihr mehr Infos was man so alles als Aufgabe stellen kann. ------- 8< ------- Hi all, Sorry if you see this more than once as i hit a couple of different mailing lists. We are attempting to participate in the Google Code In this year and as always time is short. We need tasks added here: http://wiki.enlightenedperl.org/gci2012/tasks In the next 48 hours (and most definately before midnight Friday). More information can be found here: http://wiki.enlightenedperl.org/gci2012 Please could you forward this on to relevant people in your groups, projects and spread the word in other channels as soon as possible. Thanks in advance (sorry for the multiple posts to those on multiple lists). Kind regards Mark -- Mark Keating BA (Hons), Writer, Photographer, Cat-Herder. Managing Director: http://www.shadow.cat For more that I do visit: http://www.mdk.me From helling at lmu.de Mon Nov 19 02:06:01 2012 From: helling at lmu.de (Robert C. Helling) Date: Mon, 19 Nov 2012 11:06:01 +0100 (CET) Subject: [Munich-pm] sort mit curried function Message-ID: 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 From marek.rouchal at intel.com Mon Nov 19 03:01:03 2012 From: marek.rouchal at intel.com (Rouchal, Marek) Date: Mon, 19 Nov 2012 11:01:03 +0000 Subject: [Munich-pm] sort mit curried function In-Reply-To: References: Message-ID: 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 From roderich.schupp at googlemail.com Mon Nov 19 03:29:13 2012 From: roderich.schupp at googlemail.com (Roderich Schupp) Date: Mon, 19 Nov 2012 12:29:13 +0100 Subject: [Munich-pm] sort mit curried function In-Reply-To: References: Message-ID: Geht IMHO nicht, es kommt auf die syntaktische "Form" in dieser Position an, nicht auf den Wert. Das ist genauso wie bei push et.al.: da muss als erster Parameter syntaktisch ein Array her, also etwas, das mit @ anfängt. Und bei sort geht an dieser Stelle syntaktisch nur ein block oder eine scalar reference. Möglich wäre allerdings sort { bykey->('x')->($a, $b) } @liste aber nur um den Preis, dass für jede Vergleichsoperation ein neues sub erzeugt wird. Cheers, Roderich -------------- next part -------------- An HTML attachment was scrubbed... URL: From harald.joerg at ts.fujitsu.com Mon Nov 19 03:40:33 2012 From: harald.joerg at ts.fujitsu.com (Harald Joerg) Date: Mon, 19 Nov 2012 12:40:33 +0100 Subject: [Munich-pm] sort mit curried function In-Reply-To: (Robert C. Helling's message of "Mon, 19 Nov 2012 11:06:01 +0100") References: Message-ID: <87pq39q0r2.fsf@mch5832n.mch.fsc.net> Hallo Robert, Dass Deine Überlegungen nicht funktionieren, liegt daran, dass sort SUBNAME LIST syntaktisch etwas "eingeschränkt" ist. Es geht aber, mit einfacherem bykey, wie folgt: ---------------------------------------------------------------------- #!/usr/bin/perl -w use strict; my @liste = ({ x => 1, y => 4}, {x => 3, y => 2}); foreach my $h (sort {bykey('x')} @liste){ print $h->{x}, $h->{y}, "\n"; } sub bykey { my $key = shift; return($a->{$key} <=> $b->{$key}); } ---------------------------------------------------------------------- * Anstelle von sort SUBNAME LIST verwende ich sort BLOCK LIST, das frisst der Parser leichter. * In bykey sind $a und $b direkt verfügbar, das sind package globals (@Marek: Die muss man also nicht übergeben). Der Code ist nicht reentrant, es wäre also unklug, innerhalb von bykey nochmal einen sort-Aufruf zu haben (ginge auch, aber nur über sort mit Prototypes). Es ist aber nicht nötig, eine eigene Subroutine zu erzeugen. (@Roderich: Geht nicht - gibt's nicht :)) -- Cheers, haj "Robert C. Helling" writes: > 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 From roderich.schupp at googlemail.com Mon Nov 19 04:34:54 2012 From: roderich.schupp at googlemail.com (Roderich Schupp) Date: Mon, 19 Nov 2012 13:34:54 +0100 Subject: [Munich-pm] sort mit curried function In-Reply-To: <87pq39q0r2.fsf@mch5832n.mch.fsc.net> References: <87pq39q0r2.fsf@mch5832n.mch.fsc.net> Message-ID: 2012/11/19 Harald Joerg > * 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. 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? Cheers, Roderich -------------- next part -------------- An HTML attachment was scrubbed... URL: From harald.joerg at ts.fujitsu.com Mon Nov 19 06:16:22 2012 From: harald.joerg at ts.fujitsu.com (Harald Joerg) Date: Mon, 19 Nov 2012 15:16:22 +0100 Subject: [Munich-pm] sort mit curried function In-Reply-To: (Roderich Schupp's message of "Mon, 19 Nov 2012 13:34:54 +0100") References: <87pq39q0r2.fsf@mch5832n.mch.fsc.net> Message-ID: <87ip91ptjd.fsf@mch5832n.mch.fsc.net> Roderich Schupp schreibt: > 2012/11/19 Harald Joerg > >    * 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 From japh at opensauce.de Mon Nov 19 13:26:52 2012 From: japh at opensauce.de (Stephen Riehm) Date: Mon, 19 Nov 2012 22:26:52 +0100 Subject: [Munich-pm] sort mit curried function In-Reply-To: <87pq39q0r2.fsf@mch5832n.mch.fsc.net> References: <87pq39q0r2.fsf@mch5832n.mch.fsc.net> Message-ID: Hi Jungs, mag hier niemand das "Schwarzian Transform"? #!/usr/bin/perl use strict; use warnings; my @liste = ( { x => 1, y => 4 }, { x => 3, y => 2 } ); my $key = 'y'; my @sortierte_liste = map { $_->[0] } # nur noch das original ref weiter geben sort { $a->[1] <=> $b->[1] } # billige Vergleich map { [ $_, $_->{$key} ] } # berechne den teueren Sort-Schlüssel @liste; foreach my $h ( @sortierte_liste ) { printf "%d %d\n", $h->{x}, $h->{y}; } (das geht natürlich auch ohne zwischen-Liste) Vorteile: beliebig komplexe Sortierungen werden nicht beliebig komplex (die Struktur bleibt immer gleich) wenn teuerer Vergleichswerte im Spiel sind - werden sie nur einmal pro Eintrag in der Liste berechnet (ie: wichtig wenn man Objekte sortieren will) Nur meine 3,56€ (2c + Inflation :-() Steve On 19.11.2012, at 12:40, Harald Joerg wrote: > Hallo Robert, > > Dass Deine Überlegungen nicht funktionieren, liegt daran, dass > sort SUBNAME LIST syntaktisch etwas "eingeschränkt" ist. > > Es geht aber, mit einfacherem bykey, wie folgt: > > ---------------------------------------------------------------------- > #!/usr/bin/perl -w > > use strict; > > my @liste = ({ x => 1, y => 4}, {x => 3, y => 2}); > > foreach my $h (sort {bykey('x')} @liste){ > print $h->{x}, $h->{y}, "\n"; > } > > sub bykey { > my $key = shift; > > return($a->{$key} <=> $b->{$key}); > } > ---------------------------------------------------------------------- > > * Anstelle von sort SUBNAME LIST verwende ich sort BLOCK LIST, > das frisst der Parser leichter. > > * In bykey sind $a und $b direkt verfügbar, das sind package globals > (@Marek: Die muss man also nicht übergeben). Der Code ist nicht > reentrant, es wäre also unklug, innerhalb von bykey nochmal einen > sort-Aufruf zu haben (ginge auch, aber nur über sort mit > Prototypes). > > Es ist aber nicht nötig, eine eigene Subroutine zu erzeugen. > (@Roderich: Geht nicht - gibt's nicht :)) > -- > Cheers, > haj > > > > "Robert C. Helling" writes: > >> 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 > _______________________________________________ > Munich-pm mailing list http://munich.pm.org/ > Munich-pm at pm.org > http://mail.pm.org/mailman/listinfo/munich-pm -------------- next part -------------- An HTML attachment was scrubbed... URL: