next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Práctica: Conjuntos a través Sup: Referencias Ant: La notación flecha Err: Si hallas una errata ...

Paso de arrays y hashes a subrutinas

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( \&times, 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
next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
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