10. december

Perl: Kode som argumenter til funktioner

En række perlfunktioner (blandt andet sort og map) tager et stykke kode med som argument. Det gør funktionerne mere generelle, da der så ikke skal skrives en speciel sortfunktion for alle mulige måder en række værdier kan ordnes på.
For eksempel kan man sorterer på absolutte værdier:
@foo = (1, -42, 666, 17, -7, 5)
@bar = sort { abs($a) <=> abs($b) } @foo;
vil giver @bar værdien (1, 5, -7, 17, -42, 666).
Men hvordan laver man den slags funktioner selv?
Man definerer funktionen med prototyper. Lad os lave en funktion, der givet en liste returnerer en liste med de elementer der opfylder en eller anden betingelse:
sub pred (&@) {
    $test = shift @_;
    my @result = ();

    while ($_ = shift @_) {
	if (&$test) { push @result, $_}
    }

    @result
}
Efter funktionsnavnet skriver vi hvilke typer af argumenter funktionen tager. Funktionen pred tager en kodeblok og en liste. I whileløkken bindes hvert af elementerne i listen til $_ og kodeblokken udføres, hvis den returnere sand gemmes $_ på resultatlisten.
Man kan prøve at udføre følgende kode:
@foo = (1, 42, 666, 17, 128, 7, 5);
@bar = pred { $_ < 42 } @foo;
print join(",", @bar);
Hvilket vil skrive tallene 1, 17, 7 og 5 ud på skærmen.
For mere information læs manualsiden perlsub.