viernes, 24 de marzo de 2017

Validando la entrada

Con nuestra nueva habilidad para tener entrada de teclado aparece un nuevo desafío de programación, validar la entrada. Muy a menudo la diferencia entre un programa bien escrito y uno mal escrito reside en la capacidad del programa de tratar lo inesperado. Frecuentemente, lo inesperado aparece en forma de una mala entrada. Hemos hecho algo de esto con nuestros programas de evaluación en el capítulo anterior, donde comprobamos los valores de enteros y descartamos valores vacíos y caracteres no numéricos. Es importante realizar este tipo de comprobaciones de programación cada vez que un programa recibe entrada, para protegernos de datos no válidos. Esto es especialmente importante para programas que son compartidos por múltiples usuarios. Omitir estos salvavidas en interés de la economía podría excusarse si un programa va a ser utilizado una sola vez y sólo por el autor para realizar tareas especiales. Incluso así, si el programa realiza tareas peligrosas como borrar archivos, sería prudente incluir validación de datos, por si acaso.

Aquí tenemos un programa de ejemplo que valida varios tipos de entrada:

#!/bin/bash

# read-validate: validate input

invalid_input () {
     echo "Invalid input '$REPLY'" >&2
     exit 1
}

read -p "Enter a single item > "

# input is empty (invalid)
[[ -z $REPLY ]] && invalid_input

# input is multiple items (invalid)
(( $(echo $REPLY | wc -w) > 1 )) && invalid_input

# is input a valid filename?
if [[ $REPLY =~ ^[-[:alnum:]\._]+$ ]]; then
     echo "'$REPLY' is a valid filename."
     if [[ -e $REPLY ]]; then
          echo "And file '$REPLY' exists."
     else
          echo "However, file '$REPLY' does not exist."
     fi

     # is input a floating point number?
     if [[ $REPLY =~ ^-?[[:digit:]]*\.[[:digit:]]+$ ]]; then
          echo "'$REPLY' is a floating point number."
     else
          echo "'$REPLY' is not a floating point number."
     fi

     # is input an integer?
     if [[ $REPLY =~ ^-?[[:digit:]]+$ ]]; then
          echo "'$REPLY' is an integer."
     else
          echo "'$REPLY' is not an integer."
     fi
else
     echo "The string '$REPLY' is not a valid filename."
fi

Este script pide al usuario que introduzca un elemento. El elemento es analizado posteriormente para determinar su contenido. Como podemos ver, el script hace uso de muchos de los conceptos que hemos visto hasta ahora, incluidas las funciones de shell, [[ ]], (( )), el operador de control &&, e if, así como una buena dosis de expresiones regulares.

No hay comentarios:

Publicar un comentario