max deberá calcular el máximo o el mínimo
de los elementos de una lista.
El primer argumento de la función es una cadena conteniendo
el operador de comparación a usar (por ejemplo < o >
o gt o lt).
Utilizamos la función eval
la cuál
recibe una cadena y evalúa la expresión Perl que representa.
~/perltesting/lhp$ cat -n max2.pl
1 #!/usr/bin/perl -w
2 use strict;
3 use List::Util qw{reduce};
4
5 sub max {
6 my $op = (shift || "<");
7
8 die "Error. Bad comparison operator '$op'\n" unless $op =~ m{([<>])|(gt)|(lt)};
9
10 return undef unless @_;
11
12 my $comparison = '$a '.$op.' $b ';
13
14 no warnings 'once';
15 return reduce { eval $comparison ? $b : $a } @_;
16 }
17
18 my $m1 = max("<", 5, 4, 9, 1, 0);
19 my $m2 = max(">",-1, -5, 0, 13, 12, 7);
20 my $m3 = max("lt",-1, "b", 0, 13, 12, 7, "a");
21 my $m4 = max("gt",-1, "b", 0, 13, 12, 7, "a");
22 my $m5 = max();
23
24 print "$m1, $m2, $m3, $m4\n";
25
26 print "$m5\n" if defined($m5);
Sigue un ejemplo de ejecución:
~/perltesting/lhp$ perl5.10.0 max2.pl 9, -5, b, -1 ~/perltesting/lhp$
Casiano Rodríguez León
