Reescribiendo reduce mediante Prototipos

El siguiente código implanta una función reduce similar a la proveída por el módulo List::Util presentado en la sección 1.13.2. Aunque la versión en List::Util es esencialmente similar en funcionalidad, es mas eficiente al estar escrita en C.

lhp@nereida:~/Lperl/src/hop/Chap7$ cat -n reduce.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  use Scalar::Util qw(looks_like_number);
 4  use List::MoreUtils qw(all);
 5
 6  sub reduce (&@) {
 7    my $code = shift;
 8    my $val = shift;
 9    local ($a, $b);
10    for (@_) {
11      ($a, $b) = ($val, $_);
12      $val = $code->()
13    }
14    return $val;
15  }
16
17    die "\n$0 number number ...\n"
18  unless @ARGV and all { looks_like_number($_) } @ARGV;
19  my $s = reduce { $a+$b } @ARGV;
20  my $p = reduce { $a*$b } @ARGV;
21
22  print "Suma = $s, Prod = $p\n";

El uso del prototipo nos permite omitir el uso de la palabra reservada sub y la coma intermedia. La localización de las variables $a y $b nos permite evitar la posible contaminación de variables globales con el mismo nombre.

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19