Esta es una solución para Perl v5.10 (las versiones para Perl v5.8 son muy fáciles, usando variables globales):
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use 5.010;
sub a {
state $x; # $x y $a mantendrán sus valores en todas
state $a; # las llamadas a la función
$x++; # Incrementamos $x
$a .= $x == 1 # $a almacenará la cadena. Si el valor de $x es 1 (primera vuelta),
? "$x" # devolvemos el valor "$x" (que ahora contiene un '1'); sino,
: ",$x" # devolvemos el valor ",$x" (el resto de vueltas)
; # El valor lo agregamos a $a
# El valor devuelto por la función es el último valor calculado ($a)
}
for (1 .. 10) {
say 'numero=', a();
}
__END__
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
aunque, realmente, queda igual de corta si seguimos usando la opción de la función join():
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
sub a {
state $x; # $x mantendrá su valor
$x++; # Incrementamos $x
join q[,], 1 .. $x; # Generamos la secuencia
} # El valor devuelto por la función es el último valor calculado
for (1 .. 10) {
say 'numero=', a();
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Son dos formas distintas de resolver el problema: la primera va almacenando la generación de la secuencia, mientras que la segunda genera una secuencia completa cada vez que se llama a la función. El elegir una u otra depende de lo que necesitemos hacer después o de si la secuencia puede crecer de forma indefinida.
Este estilo de programación en el que un objeto o función almacena un estado que nos permite recorrer una secuencia o colección de objetos, se llama
Iterador.