Recibiendo y Retornando una Lista

Las subrutinas en Perl reciben una lista de argumentos (en @_) y pueden retornar una lista. Para hacerlo, Perl usa una pila de valroes escalares (SV). Cuando la subrutina es llamada los argumentos se ponen en la pila. Recíprocamente, en el retorno, después de limpiar la pila, los valores devueltos se empujan en la pila.

$ cat stack.pl
#!/usr/bin/perl -w

use strict;
use Inline 'C';
my $n = shift || die "Uso:\n$0 number\n";
my @prefix_sum = &prefix_sum(1..$n);
print "Suma de prefijos: @prefix_sum\n";

__END__
__C__
void prefix_sum(int n1, ... ) {
  Inline_Stack_Vars; # Inicialización de la pila
  int i;
  double ps[Inline_Stack_Items];

  ps[0] = n1;
  for(i = 1; i < Inline_Stack_Items; i++) {
    ps[i] = SvNV(Inline_Stack_Item(i)) + ps[i-1];
  }
  Inline_Stack_Reset; # limpiamos la pila 
  for(i=0; i < Inline_Stack_Items; i++) {
    Inline_Stack_Push(newSVnv(ps[i])); # Empujamos los valores de retorno
  }
  Inline_Stack_Done; # Terminamos de manipular la pila
}
Ejecución:
$ ./stack.pl 20
Suma de prefijos: 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210

Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
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=44.
2012-06-19