Entrada y salida estandar de la mano de gets y puts

Venga, por fin avanza un poco más deprisa. Las funciones puts y gets del módulo IO permiten imprimir de verdad en pantalla, y leer del teclado. Esto lo necesitaremos si queremos ver letras en la terminal cuando abandonemos IEx.

Cuando trabajamos con cadenas de caracteres en Elixir, es común encontrarnos con caracteres especiales que pueden complicar la visualización directa de los textos, como saltos de línea o comillas. Al evaluar estas cadenas en el intérprete, aparecen símbolos como barras invertidas que indican la presencia de estos caracteres especiales, pero que no resultan muy amigables para mostrar al usuario final.

Para manejar esta situación, no basta con confiar en la impresión que hace el intérprete, ya que esta es solo una representación interna del resultado de la evaluación, no una forma adecuada de presentar información en pantalla. Cuando ejecutamos programas fuera del entorno interactivo, necesitamos utilizar mecanismos formales para enviar texto a la terminal o a cualquier otro destino que pueda capturar la salida, como archivos o incluso interfaces web.

En Elixir, la salida estándar y la entrada estándar son los canales habituales para comunicarnos con el exterior. La salida estándar es el lugar donde enviamos texto para que sea mostrado, normalmente en la ventana de la terminal, pero también puede redirigirse a otros dispositivos o programas. La entrada estándar, por su parte, es el medio por el que recibimos información, ya sea desde el teclado, otro programa o incluso a través de conexiones de red.

Para trabajar con estos canales, Elixir nos ofrece funciones específicas en el módulo IO. La función IO.puts es la encargada de imprimir texto en la salida estándar de forma adecuada. A diferencia de la evaluación directa de cadenas, IO.puts interpreta correctamente los caracteres especiales, mostrando saltos de línea y comillas sin las barras invertidas que aparecen en la evaluación. Por ejemplo, si definimos una variable con saltos de línea:

mensaje_2 = "Hola\nMundo\n"

Al evaluarla directamente, veremos los caracteres \n visibles, pero si usamos IO.puts(mensaje_2), el texto se mostrará con los saltos de línea interpretados, es decir, en varias líneas.

Es importante destacar que IO.puts devuelve siempre :ok como resultado, ya que su propósito principal es producir un efecto colateral: imprimir en pantalla. Esto es una excepción dentro del paradigma funcional, donde las funciones suelen ser puras y sin efectos secundarios. Sin embargo, las funciones que interactúan con el mundo exterior, como las de entrada y salida, necesitan tener estos efectos colaterales para funcionar correctamente.

Por otro lado, para capturar información del usuario, contamos con la función IO.gets. Esta función espera a que el usuario introduzca texto por teclado y presione Enter, devolviendo la cadena ingresada, incluyendo el salto de línea final. Podemos pasarle un mensaje como parámetro para mostrar un prompt antes de la entrada, por ejemplo:

entrada = IO.gets("Escribe algo: ")

Si el usuario escribe hola y pulsa Enter, entrada contendrá "hola\n". Para limpiar ese salto de línea y otros espacios en blanco al principio o al final, podemos usar la función String.trim:

entrada_limpia = String.trim(entrada)

De esta forma, obtenemos solo el texto que el usuario ha escrito, sin caracteres adicionales.

En resumen, para interactuar con el usuario o con otros sistemas a través de la terminal en Elixir, es fundamental utilizar IO.puts para mostrar información y IO.gets para recibirla, manejando adecuadamente los caracteres especiales para que la experiencia sea clara y profesional.

Lista de reproducción
  1. 1
    ¿Qué es Elixir?
    10 minutos
  2. 2
    Instalación de Elixir
    9 minutos
  3. 3
    ¿Qué es la programación funcional? (Como la de Elixir)
    20 minutos
  4. 4
    ¿Cómo funciona la REPL de Elixir?
    7 minutos
  5. 5
    ¿Cómo hacer asignaciones en Elixir?
    7 minutos
  6. 6
    Operadores aritméticos básicos
    6 minutos
  7. 7
    ¿Qué son los tipos de datos de Elixir?
    5 minutos
  8. 8
    Átomos en Elixir
    4 minutos
  9. 9
    Las palabras clave nil, true y false
    6 minutos
  10. 10
    Operadores lógicos de comparación
    8 minutos
  11. 11
    Comparación estricta con ===
    3 minutos
  12. 12
    Operadores lógicos y proposicionales
    8 minutos
  13. 13
    Invocación de funciones
    10 minutos
  14. 14
    Fundamentos de funciones
    9 minutos
  15. 15
    Cadenas de caracteres
    8 minutos
  16. 16
    Entrada y salida estandar de la mano de gets y puts
    9 minutos
  17. 17
    Concatenar e interpolar strings
    9 minutos
  18. 18
    Código fuente en archivos
    9 minutos
  19. 19
    Condicional IF y bloques DO-END
    11 minutos
  20. 20
    IFs anidados, UNLESS y COND
    12 minutos
  21. 21
    Definición de funciones
    11 minutos
  22. 22
    Fundamentos de compilación de módulos
    6 minutos
  23. 23
    Guardas
    8 minutos
  24. 24
    Funciones anónimas
    7 minutos
  25. 25
    Capturar funciones
    4 minutos
  26. 26
    Invocación de funciones dentro del mismo módulo
    7 minutos
  27. 27
    Tuplas
    8 minutos
  28. 28
    Introducción al pattern matching
    8 minutos
  29. 29
    Pattern matching en funciones
    11 minutos
  30. 30
    Las tuplas :ok, :error
    7 minutos
  31. 31
    case
    10 minutos
  32. 32
    Operador pin
    7 minutos
  33. 33
    Pattern matchings y recursividad
    5 minutos
  34. 34
    Listas
    9 minutos
  35. 35
    Operadores y funciones de lista
    10 minutos
  36. 36
    Keyword lists: listas de palabras clave
    8 minutos
  37. 37
    Mapas
    7 minutos
  38. 38
    Pattern matching de mapas y keyword lists
    6 minutos
  39. 39
    Operadores y funciones para mapas y keyword lists
    5 minutos
  40. 40
    Estructuras con defstruct
    11 minutos
  41. 41
    Bitstrings
    11 minutos
  42. 42
    Charlists
    10 minutos
  43. 43
    Funciones de alto orden en Elixir
    5 minutos
  44. 44
    Uso de la función filter
    10 minutos
  45. 45
    Uso de la función map
    7 minutos
  46. 46
    Uso de la función reduce
    9 minutos
  47. 47
    Pipelines
    11 minutos
  48. 48
    Rangos y Streams
    11 minutos
  49. 49
    Funciones recursivas con listas
    14 minutos