#!/usr/bin/perl
print "Introduce dos numeros separados por un espacio? ";
($n,$t) = split (/\s+/, <>);
print "Has introducido $n y $t\n";
print "Introduce 10 numeros separados por espacios?\n";
@a = split(/\s+/, <>);
print "Has introducido: ";
foreach $i (@a)
{
print "$i ";
}
print "\n";En Perl, las cosas son mucho más sencillas ya que no es necesario (en general) convertir tipos. Perl está perfectamente cómodo trabajando con variables que a veces son cadenas de caracteres y a veces son números.
En este caso resulta más sencillo leer la entrada del usuario como
una línea de texto y partir posteriormente, ya que Perl es realmente
bueno en esto. La forma más sencilla de partir una cadena de caracteres
es utilizando la función split. En este caso hemos
utilizado espacios como separadores, pero podemos cambiar esto muy
fácilmente modificando el primer parámetro de split.
El primer parámetro de
splites una expresión regular. Las reconoceréis por estar rodeadas por el caracter/. Perl ofrece sus propias expresiones regulares (junto con las más clásicas). En este ejemplo la expresión regular nos permite localizar secuencias de uno o más espacios. Eso es lo que significa/\s+/.La potencia de esta expresión es que
\sno solo representa el caracter espacio, sino que tiene en cuenta otros caracteres como tabuladors, retornos de carro, etc…
En este ejemplo no ha sido necesario gestionar el retorno de carro en
la entrada de usuario, pero debemos saber que Perl nos devuelve ese
caracter. Para eliminarlo podemos utilizar la función
chomp. La primera lectura del programa quedaría de esta
forma:
$linea = <>;
chomp ($linea);
($n, $t) = split (/\s+/, $linea);Alternativamente podemos utilizar expresiones regulares más complejas
para, leer distintos tipos de datos y validar la entrada
simultáneamente. Para ello podemos utilizar el operador =~.
Algo como esto:
($n,$t) = $line =~/^(-?\d+)\s+(-?\d+)/;Esta línea evalúa la expresión regular respecto al contenido de
$line, y retorna los grupos capturados como una lista que
podemos asignar directamente a otra lista que contiene nuestras
variables.
En una expresión regular, cuando una parte de ella se encuentra entre paréntesis, eso define un grupo. Los grupos se asignan a las variables temporales
$1para el primer grupo,$2para el segundo, y así sucesivamente. En nuestra expresión regular tenemos dos grupos (dos partes de la expresión entre paréntesis), separados por espacios\s+(uno o más espacios).Cada grupo usa la expresión regular
(-?\d+)que significa, devuelve aquello que tenga un-al principio (opcionalmente, eso significa el?) y luego sigan uno o más digitos (\d+).
Si quisiéramos detectar errores podríamos reescribir el código anterior de la siguiente forma:
die "Entrada invalida" unless $line =~/^(-?\d+)\s+(-?\d+)/;
($n, $t) = ($1, $2);El operador =~ cuando se evalua en un entorno escalar,
es decir, en una expresión en la que se espera recibir un único valor,
devuelve true si la expresión regular se cumple, o
falso si no. De esta forma podemos usarlo para comprobar
que los datos están en el formato correcto.
En nuestro ejemplo anterior, el operador =~ estaba usado
en un entorno de lista y en ese caso, el operador devuelve los grupos de
la expresión regular como una lista de valores, por esa razón podíamos
asignarlos directamente.
En el segundo caso, evaluamos el operador en un entorno escalar que usamos para comprobar errores, así que tenemos utilizar directamente las variables temporales que continen los resultados de los grupos en la expresión regular.
Sumario
- En Perl, leemos líneas completas y las parseamos usando expresiones
regulares o funciones como
split - Alternativamente podemos utilizar el operador
=~y expresiones regulares para leer distintos tipos de valores. - Podemos usar elaboradas expresiones regulares para validar los datos de entrada a nuestro programa.
■
