• Save
Perl4 io
Upcoming SlideShare
Loading in...5
×
 

Perl4 io

on

  • 434 views

 

Statistics

Views

Total Views
434
Views on SlideShare
431
Embed Views
3

Actions

Likes
1
Downloads
0
Comments
0

1 Embed 3

http://www.linkedin.com 3

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • Explicar que esto es lo mismo que ponerlo así:\n\nwhile (defined($_ = )) {\nprint "I saw $_"; \n}\n\n\n
  • Ver uso incorrecto en stdin.pl\n
  • Ver uso incorrecto en stdin.pl\n
  • Ver uso incorrecto en stdin.pl\n
  • While: lee una línea y te lamuestra en pantalla cada vez\nforeach: lee TODAS las líneas y cuando has terminado te las imprime\n\nEn while se va leyendo mientras se ejecuta el bucle\nCon foreach el bucle no se ejecuta hasta que terminas de leer.\n
  • \n
  • \n
  • \n
  • fichero: diamond.pl\n\nSi uno de los ficheros no existe, se da un warning y se salta al siguiente.\n\nSe puede contar la historia de porqué se llama: la hija de Larry lo vió y dijo “Eso es un diamante, papi” y se quedó con ese nombre.\n\n\n
  • fichero: diamond.pl\n\nSi uno de los ficheros no existe, se da un warning y se salta al siguiente.\n\nSe puede contar la historia de porqué se llama: la hija de Larry lo vió y dijo “Eso es un diamante, papi” y se quedó con ese nombre.\n\n\n
  • fichero: diamond.pl\n\nSi uno de los ficheros no existe, se da un warning y se salta al siguiente.\n\nSe puede contar la historia de porqué se llama: la hija de Larry lo vió y dijo “Eso es un diamante, papi” y se quedó con ese nombre.\n\n\n
  • fichero: diamond.pl\n\nSi uno de los ficheros no existe, se da un warning y se salta al siguiente.\n\nSe puede contar la historia de porqué se llama: la hija de Larry lo vió y dijo “Eso es un diamante, papi” y se quedó con ese nombre.\n\n\n
  • fichero: diamond.pl\n\nSi uno de los ficheros no existe, se da un warning y se salta al siguiente.\n\nSe puede contar la historia de porqué se llama: la hija de Larry lo vió y dijo “Eso es un diamante, papi” y se quedó con ese nombre.\n\n\n
  • \n
  • \n
  • \n
  • Preguntar qué sale por pantalla en cada caso\n
  • Preguntar qué sale por pantalla en cada caso\n\nejemplo en cosas_de_perl.pl\n
  • Explicar por qué en el caso anterior se imprime 5 en los dos casos.\nprint(3+2) -> como tiene paréntesis, se imprime 3+2 y se devuelve true (que suele ser 1)\nprint(3+2)*4 -> como tiene paréntesis, se imprime 3+2, se devuelve true y se multiplica por 4.\n
  • Explicar por qué en el caso anterior se imprime 5 en los dos casos.\nprint(3+2) -> como tiene paréntesis, se imprime 3+2 y se devuelve true (que suele ser 1)\nprint(3+2)*4 -> como tiene paréntesis, se imprime 3+2, se devuelve true y se multiplica por 4.\n
  • Explicar por qué en el caso anterior se imprime 5 en los dos casos.\nprint(3+2) -> como tiene paréntesis, se imprime 3+2 y se devuelve true (que suele ser 1)\nprint(3+2)*4 -> como tiene paréntesis, se imprime 3+2, se devuelve true y se multiplica por 4.\n
  • Explicar por qué en el caso anterior se imprime 5 en los dos casos.\nprint(3+2) -> como tiene paréntesis, se imprime 3+2 y se devuelve true (que suele ser 1)\nprint(3+2)*4 -> como tiene paréntesis, se imprime 3+2, se devuelve true y se multiplica por 4.\n
  • Los dos primeros son lo mismo\nel tercero abre un fichero y lo machaca si ya existe\nel cuarto lo abre para añadir.\n\n
  • \n
  • más seguro porque perl no puede confundir los caracteres del modo del fichero con el caracteres que forman parte del nombre del fichero\n\n
  • \n
  • \n
  • Explicar qué hace la función die: imprime el error y muestra el mensaje por pantalla y nos concatena el número de línea.\n\nSi no queremos escribir esto todo el rato, podemos usar autodie (use autodie)\n
  • \n
  • \n
  • \n
  • \n
  • Es muy mala idea usar select y, al terminarm no volverlo a poner en STDOUT\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • mirar filehandlers.pl\n
  • \n

Perl4 io Perl4 io Presentation Transcript

  • Programación en Perl Input / Output
  • Entrada estándarSe utiliza el operador <STDIN> Si se usa en contexto escalar lee una línea Si se usa en contexto de lista, lee hasta que se detecta un EOF (CTRL-D Unix o CTRL-Z en windows)Este operador devuelve undef cuando se detectael fin de línea
  • Entrada estándar Gracias a que devuelve undef podemos escribir el siguiente códigowhile (defined($line = <STDIN>)) { print "I saw $line";}
  • Entrada estándar Esta última construcción es tan habitual que existe una forma de escribirla mucho más compacta.while (<STDIN>) { say "Línea: $_";}
  • Entrada estándar
  • Entrada estándarEsta notación más compacta funciona sólo si seusa de esta forma.
  • Entrada estándarEsta notación más compacta funciona sólo si seusa de esta forma.Si se utiliza el operador <STDIN> en algún otrolugar, la línea no se carga en la variable $_
  • Entrada estándar Esta notación más compacta funciona sólo si se usa de esta forma. Si se utiliza el operador <STDIN> en algún otro lugar, la línea no se carga en la variable $_#ESTO DA UN ERROR: no se lee la línea en la variable $_<STDIN>;say "$_";
  • Entrada estándar Como ya hemos visto, el operador <STDIN> en contexto de lista devuelve todas las líneas que faltan y las guarda en un array. ¿Qué diferencia hay entre while(<STDIN>) de los ejemplos anteriores y el siguiente:foreach(<STDIN>) { chomp; say;}
  • El operador <>
  • El operador <>Sirve para facilitarnos la tarea de hacer scriptsque se comporten como programas Unix
  • El operador <>Sirve para facilitarnos la tarea de hacer scriptsque se comporten como programas Unix muestra elcat fich1.txt fich2.txt fich3.txtcontenido de los tres ficheros por pantalla
  • El operador <>Sirve para facilitarnos la tarea de hacer scriptsque se comporten como programas Unix muestra elcat fich1.txt fich2.txt fich3.txtcontenido de los tres ficheros por pantalla¿Cómo conseguimos lo mismo con nuestro script?miscript.pl fich1.txt fich2.txt fich3.txt
  • El operador <>while (<>) { chomp; print "Leído: $_n";}
  • El operador <>while (<>) { chomp; print "Leído: $_n";} miscript.pl fich1.txt fich2.txt fich3.txt
  • El operador <>while (<>) { chomp; print "Leído: $_n";} miscript.pl fich1.txt fich2.txt fich3.txt Lee todas las líneas de fich1.txt
  • El operador <>while (<>) { chomp; print "Leído: $_n";} miscript.pl fich1.txt fich2.txt fich3.txt Lee todas las líneas de fich1.txt Lee todas las líneas de fich2.txt
  • El operador <>while (<>) { chomp; print "Leído: $_n";} miscript.pl fich1.txt fich2.txt fich3.txt Lee todas las líneas de fich1.txt Lee todas las líneas de fich2.txt Lee todas las líneas de fich3.txt
  • El operador <>while (<>) { chomp; print "Leído: $_n";} miscript.pl fich1.txt fich2.txt fich3.txt Lee todas las líneas de fich1.txt Lee todas las líneas de fich2.txt Lee todas las líneas de fich3.txt Termina
  • Argumentos del scriptPerl guarda todos los argumentos con los que seejecuta un script en el array @ARGV.@ARGV es un array así que podemos, porejemplo, procesarlo con un foreach para ver quéargumentos empiezan con - y procesarlosconvenientemente.
  • Salida estándarLas funciones print y say esperan una lista decadenas para imprimir, es decir, evalúa susargumentos en un contexto de lista.¿Qué hacen estos scripts? print <> -> comando cat print sort <> -> comando sort
  • Salida estándarLas funciones print y say esperan una lista decadenas para imprimir, es decir, evalúa susargumentos en un contexto de lista.¿Qué hacen estos scripts? print <> -> comando cat print sort <> -> comando sort
  • Cosas de perl...¿Qué se imprime por pantalla en cada caso? print (3+2) print (3+2)*4
  • Cosas de perl...¿Qué se imprime por pantalla en cada caso? print (3+2) -> se muestra 5 print (3+2)*4 -> se muestra 5
  • Cosas de perl...
  • Cosas de perl...En perl los paréntesis son opcionales si su usono cambia el significado de una expresión.
  • Cosas de perl...En perl los paréntesis son opcionales si su usono cambia el significado de una expresión.Por eso podemos escribirprint sort <> en lugar de print ( sort ( <> ) )
  • Cosas de perl...En perl los paréntesis son opcionales si su usono cambia el significado de una expresión.Por eso podemos escribirprint sort <> en lugar de print ( sort ( <> ) )Si parece una llamada a una función, entoncesse interpreta como una llamada a una función
  • Cosas de perl...En perl los paréntesis son opcionales si su usono cambia el significado de una expresión.Por eso podemos escribirprint sort <> en lugar de print ( sort ( <> ) )Si parece una llamada a una función, entoncesse interpreta como una llamada a una función¿Y esto en castellano qué quiere decir?
  • Abrir un ficheroopen CONFIG, /etc/my.cnf;open CONFIG, </etc/my.cnf;open DATOS, >usuarios.txt;open LOG, >>logfile;
  • Abrir un fichero Se puede utilizar cualquier valor escalar para indicar el nombre del fichero$logFile = “/var/log/my.log”open LOG, “>>$logFile”;
  • Abrir un fichero A partir de perl 5.6 se pueden utilizar tres argumentos$logFile = “/var/log/my.log”open LOG, “>>”,$logFile ; Ventajas: más seguro se puede especificar la codificación: open LOG, “>>:encoding(utf-8)”,$logFile ;
  • Abrir un ficheroMás ventajas: el modo <:crlf nos permite leer un fichero de windows, convirtiendo automáticamente el fin de línea al sistema Unix el modo >:crlf nos permite escribir un fichero con formato Windows de fin de línea
  • Cerrar un fichero close LOG ;
  • Control de errores La función open devuelve verdadero si el fichero pudo abrirse y falso en caso contrario La variable especial $! almacenará el error que el sistema operativo nos devuelveif ( ! open LOG, >>, logfile ) { die "No se puede crear el fichero logfile: $!";}
  • Leer de un ficherowhile (<PASSWD>) { chomp; ...}foreach (<PASSWD>) { chomp; ...}
  • Escribir en un ficheroprint LOG “2011-07-28: acceso denegado a luisn”;printf STDERR “No existe la base de datos VENTAS_2008”
  • EjerciciosEscribir dos programas, unix2dos y dos2unix,que convierta los ficheros de unix en fichero dewindows y viceversa.
  • Cambiando el selector por defecto Si vamos a trabajar durante unas cuantas líneas de código simpre con el mismo manejador, se puede hacer un poco tediosoprint LOG “Se han producido los siguiente error:n”;print LOG “t- Despliegue incorrecto de base de datosn”;... (15 líneas de código más abajo)print LOG “----FIN DEL ERRORn”
  • Cambiando el selector por defecto Si vamos a trabajar durante unas cuantas líneas de código simpre con el mismo manejador, se puede hacer un poco tediososelect LOG;print “Se han producido los siguiente error:n”;print “t- Despliegue incorrecto de base de datosn”;... (15 líneas de código más abajo)print “----FIN DEL ERRORn”select STDOUT;
  • Control de buffering Si se fija la variable especial $| a 1 ($|=1), el manejador seleccionado escribe al fichero con cada operación de escrituraselect LOG;$| = 1;select STDOUT;...print LOG “Esta línea se escribe directamente al fichero sinpasar por el buffer.”
  • Redireccionando STDERR# Enviando mensajes de error a nuestro logif ( ! open STDERR, ">>/home/yo/miscript_error_log") { die "No se pudo abrir el fichero de log: $!";}
  • Redireccionando STDERR Casi siempre será mejor permitir al usuario que haga la redirección utilizando la shell. Situaciones en las que esto puede ser útil: Nuestro script se lanza a través o otros programas (como un servidor web) donde es difícil capturar la salida de error. Si perl no puede abrir el nuevo STDERR, STDIN o STDOUT, siempre usará los manejadores por defecto
  • Almacenar manejadores en variables escalares A partir de la versión 5.6 de perl, es posible almacenar los manejadores en variables escalaresopen my $log_fh, <, log.txt or die "No se puedo abrir log.txt: $!";...while(<$log_fh>) { ... }print $log_fh “Mensaje de error”;
  • Almacenar manejadores en variables escalares Cuidado con la función print y $_open my $log_fh, <, log.txt or die "No se puedo abrir log.txt: $!";while(<$log_fh>) { print $log_fh;}
  • Almacenar manejadores en variables escalares Cuidado con la función print y $_open my $log_fh, <, log.txt or die "No se puede abrir log.txt: $!";while(<$log_fh>) { print {$log_fh} $_;}
  • EjerciciosEscribe un programa (tac) que muestre porpantalla el contenido de los fichero en ordeninverso a como se introducen como argumentosdel programa. El comando tac fich1 fich2 fich3debe devolver las líneas del fichero fich3 de laúltima a la primera, luego las de fich2 de laùltima a la primera y por último las de fich1 dela última al primera.