Sig: Práctica: Conjuntos a través
Sup: Referencias
Ant: La notación flecha
Err: Si hallas una errata ...
El aplanado al que somete Perl los arrays y hashes
cuando son pasados a una subrutina hace que sean indistinguibles
desde la perspectiva de la subrutina llamada.
Una forma de evitar este problema consiste en pasar
como argumentos las referencias a los arrays y los hashes implicados.
El siguiente ejemplo muestra una subrutina que recibe
una referencia a una subrutina implantando una operación
binaria, el elemento neutro de dicha operación y un vector de referencias a
arrays. Se asume que el primer array es el de mayor tamaño.
La rutina devuelve un vector conteniendo el resultado
de operar vectorialmente los diferentes vectores.
$ cat -n vect2.pl
1 #!/usr/bin/perl -w
2 use strict;
3
4 sub operate {
5 my ($rop, $neutral, $rv1) = splice @_,0,3;
6 my @res = @$rv1;
7 my $i;
8
9 for($i = 0; $i < @res; $i++) {
10 for my $v (@_) {
11 $res[$i] = $rop->($res[$i], defined($v->[$i])?$v->[$i]:$neutral);
12 }
13 }
14 @res;
15 }
16
17 sub plus { $_[0]+$_[1] }
18 sub times { $_[0]*$_[1] }
19
20 my @a = (3, 2, 1, 9);
21 my @b = (5, 6, 7);
22 my @m = operate( \&plus, 0, \@a, \@b);
23 print "@m\n";
24 my @c = (1, 2);
25 my @m2 = operate( \×, 1, \@a, \@b, \@c);
26 print "@m2\n";
Sigue el resultado de la ejecución:
$ ./vect2.pl
8 8 8 9
15 24 7 9
Subsecciones
Sig: Práctica: Conjuntos a través
Sup: Referencias
Ant: La notación flecha
Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21