Raku-Kurs / Anhang 🆕 / Alles zusammenbringen / Gemischte Mini-Projekte / Exercises / Punkte aus CSV-Zeilen
Lösung: Punkte aus CSV-Zeilen
Hier ist eine mögliche Lösung der Aufgabe.
Code
my @lines = 'Anna,90', 'Bob,72', 'Cara,84';
my %score;
for @lines -> $line {
my ($name, $mark) = $line.split(',');
%score{$name} = $mark.Int;
}
my $average = ([+] %score.values) / %score.elems;
say "average: $average";
say "above average:";
for %score.sort -> $pair {
say " {$pair.key}" if $pair.value > $average;
}🦋 Du findest den Quellcode in der Datei csv-averages.raku.
Ausgabe
average: 82
above average:
Anna
CaraKommentare
Jede Zeile am Komma zu zerlegen und
($name, $mark)zuzuweisen packt die beiden Felder auf einmal aus;.Intverwandelt den Punktzahltext in eine Zahl.Der Durchschnitt ist die Summe der Werte geteilt durch ihre Anzahl; wer ihn übertrifft, wird aufgeführt. Hier ergibt der Durchschnitt glatte
82.Diese abschließende Schleife lässt sich als Pipeline schreiben.
sortordnet die Paare,grepbehält die über dem Durchschnitt, undmapreduziert jedes übrig gebliebene Paar auf seinen Namen — der Schleifenrumpf trägt dann keine Logik mehr, nur noch die Ausgabe:say " $_" for %score.sort.grep(*.value > $average).map(*.key);
Von links nach rechts gelesen sagt das genau, was es tut: sortieren, die über dem Durchschnitt behalten, ihre Namen nehmen. Jede Stufe ist ein kleiner, in sich abgeschlossener Schritt, und
*.value/*.keysind Whatever-Sterne, die im Fluge einen Block mit einem Argument bauen.