Entrada de Datos. Perl
SOLUCIONARIO
Entrada de Datos. Perl
2026-04-19
Por
Occam's Razor

#!/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.

SOY NOVATO

El primer parámetro de split es 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 \s no 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.

SOY NOVATO

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 $1 para el primer grupo, $2 para 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) = (, );

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.

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)