lenguajes script (g)awk · python tcl/tk javascript • ... bloques para operaciones iniciales y...
TRANSCRIPT
Lenguajes script
awk
sh
Perl
Python
Tcl/Tk
JavaScript
• Lenguajes interpretados
• Pueden incluir aspectos de cualquier paradigma
Ejemplos
(g)awk
ideal para el procesamiento de textos
opera línea por línea
bloques para operaciones iniciales y finales
separa texto en columnas a base de un delimitador
> ls -l | awk ‘{print $2 “, “ $4}’
CAPÍTULO 7. PROGRAMACIÓN 140
ejecuta para cada línea de entrada, y al final se ejecuta una vez el código del bloque END{...}.El separador de instrucciones es ;.
Para ejecutar el programa desde el archivo, utilizamos la opción -f:
> ls -l | awk -f total.awk
51251228176530499845122048512512512102425605125121536512512512512512716880802048Total = 3354949>
De hecho, el bloque BEGIN no es realmente necesario, como cada variable en awk tiene el valorinicial cero. No es obligatorio incluir los bloques BEGIN y END y se puede incluir solamenteuno de los dos según la necesidad.
Si no queremos llamar explicitamente a awk, podemos “esconderlo” en el archivo de instruc-ciones por incorporar la línea #!/bin/awk -f al comienzo del archivo y darle permisionesde ejecutar el archivo por lo menos al usuario mismo:
> less total.awk#!/bin/awk -f
{print $5; total = total + $5}END {print "Total = " total}> chmod u+x total.awk> ls -l | ./total.awk
5125122817653049984512204851251215035121024
if ($3 >= 100) print $0
Un ejemplo un poco más grande: http://it.ciidit.uanl.mx/~elisa/teaching/prog/cap/calif.awk
sh
Uno de los posibles lenguajes en los cuales interactuamos con un terminal de linux/unix
Automatización de tareas en el terminal
Incorporación de variables, condiciones y ciclos
Al guardar en un archivo, se debe incluir al inicio #!/bin/sh (con la ubicación de sh en su sistema)
CAPÍTULO 7. PROGRAMACIÓN 144
lines=‘wc -l $file | awk ’{print $1}’‘echo "El archivo" $file "tiene" $lines "lineas."sum=‘expr $sum + $lines‘count=‘expr $count + 1‘
doneecho "En total son" $sum "lineas en los" $count "archivos."prom=‘expr $sum / $count‘echo "Promedio redondeado:" $promexit 0
Copiando del PDF, hay que cuidar mucho poner los símbolos al comienzo y final de las expre-siones correctamente. Cuando lo corremos, obtenemos lo siguiente:
> ./primero elisahola, elisala fecha y hora actual:Fri Jun 22 17:55:14 CDT 2007El archivo countsize tiene 23 lineas.El archivo datos.txt tiene 25 lineas.El archivo primero tiene 19 lineas.El archivo primero~ tiene 19 lineas.El archivo teclado.txt tiene 8 lineas.El archivo total.awk tiene 4 lineas.En total son 98 lineas en los 6 archivos.Promedio redondeado: 16>
Hay que tomar en cuenta que esto no va a funcionar si los nombres de los archivos o las carpetascontienen espacio blanco. Por lo general no es una buena idea utilizar blancos en los nombrespor razones de compatibilidad. También se confunde con carpetas y enlaces — como ejercicio,puedes modificar la línea que elije el nombre del archivo en una variable así que no considerecarpetas o enlaces.
Para mostrar cómo implementar condiciones y bucles en shell scripts, el siguiente ejemplo intentaverificar con un algoritmo muy simple si o no un entero es primo:
#!/bin/sh# toma como parametro un entero mayor a uno y determina si es primoecho "Determinando si" $1 "es primo:"cont=sin=$1i=2
# mientras i es menor que nwhile [ $i -lt $n ]do
# dividimos por idiv=‘expr $n / $i‘
# calculamos el producto del resultado con iprod=‘expr $div ’*’ $i‘# tomamos la diferenciamod=‘expr $n - $prod‘
# si el diferencia es ceroif [ $mod -eq 0 ]then
CAPÍTULO 7. PROGRAMACIÓN 143
> emacs -nw primeroFile Edit Options Buffers Tools Help#!/bin/shecho "hola a todos"echo "la fecha y hora actual:"dateexit 0----:---F1 primero (Fundamental)--L5--All----------------------------Wrote /u/faculty/elisa/primero> chmod u+x primero> ./primerohola a todosla fecha y hora actual:Fri Jun 22 16:31:53 CDT 2007>
Entonces, el script ejecuta cada línea escrita en la línea de instrucciones, una a la vez. Podemosincluir parámetros desde la línea de comando:
> emacs -nw primeroFile Edit Options Buffers Tools Insert Help#!/bin/shecho "hola, " $1echo "la fecha y hora actual:"dateexit 0----:---F1 primero (Shell-script[sh])--L2--All-----------------------> ./primero elisahola, elisala fecha y hora actual:Fri Jun 22 16:34:14 CDT 2007>
Los parámetros de línea de instrucciones están guardados a variables especiales $1, $2, etcétera.La variable $0 tiene en este caso el valor ./primero. Para no olvidar nosotros mismos qué eslo que hace el script, podemos añadir comentarios, o sea, líneas que contengan el símbolo #:
#!/bin/sh# toma como parametro el nombre del usuario e imprime fecha & horaecho "hola, " $1echo "la fecha y hora actual:"dateexit 0 # salir con estado normal sin errores
Podemos declarar variables y ejecutar operaciones aritméticas básicas con enteros — para másoperaciones matemáticas contamos con expr (ver man expr para más información):
#!/bin/sh# toma como parametro el nombre del usuario e imprime fecha & horaecho "hola", $1echo "la fecha y hora actual:"datesum=0count=0for file in ‘ls -1‘do
CAPÍTULO 7. PROGRAMACIÓN 144
lines=‘wc -l $file | awk ’{print $1}’‘echo "El archivo" $file "tiene" $lines "lineas."sum=‘expr $sum + $lines‘count=‘expr $count + 1‘
doneecho "En total son" $sum "lineas en los" $count "archivos."prom=‘expr $sum / $count‘echo "Promedio redondeado:" $promexit 0
Copiando del PDF, hay que cuidar mucho poner los símbolos al comienzo y final de las expre-siones correctamente. Cuando lo corremos, obtenemos lo siguiente:
> ./primero elisahola, elisala fecha y hora actual:Fri Jun 22 17:55:14 CDT 2007El archivo countsize tiene 23 lineas.El archivo datos.txt tiene 25 lineas.El archivo primero tiene 19 lineas.El archivo primero~ tiene 19 lineas.El archivo teclado.txt tiene 8 lineas.El archivo total.awk tiene 4 lineas.En total son 98 lineas en los 6 archivos.Promedio redondeado: 16>
Hay que tomar en cuenta que esto no va a funcionar si los nombres de los archivos o las carpetascontienen espacio blanco. Por lo general no es una buena idea utilizar blancos en los nombrespor razones de compatibilidad. También se confunde con carpetas y enlaces — como ejercicio,puedes modificar la línea que elije el nombre del archivo en una variable así que no considerecarpetas o enlaces.
Para mostrar cómo implementar condiciones y bucles en shell scripts, el siguiente ejemplo intentaverificar con un algoritmo muy simple si o no un entero es primo:
#!/bin/sh# toma como parametro un entero mayor a uno y determina si es primoecho "Determinando si" $1 "es primo:"cont=sin=$1i=2
# mientras i es menor que nwhile [ $i -lt $n ]do
# dividimos por idiv=‘expr $n / $i‘
# calculamos el producto del resultado con iprod=‘expr $div ’*’ $i‘# tomamos la diferenciamod=‘expr $n - $prod‘
# si el diferencia es ceroif [ $mod -eq 0 ]then
CAPÍTULO 7. PROGRAMACIÓN 145
# tenemos un divisorecho $n "no es primo, tiene divisores" $i "y" $div"."exit 0
fii=‘expr $i + 1‘doneecho $n "es primo."exit 0
El algoritmo es muy genuino — sería mucho mejor no dividir con otros números pares despuésde dos. Intenta como ejercicio modificar el algoritmo para no hacerlo. Además, bastaría probardivisores hasta la raiz cuadrada del número de entrada. Algunos ejemplos de la función del pro-gramita simple, guardado en el archivo primo con permisiones de ejecución, son los siguientes:
> chmod u+x primo> ./primo 2947Determinando si 2947 es primo:2947 no es primo, tiene divisores 7 y 421.> ./primo 3969Determinando si 3969 es primo:3969 no es primo, tiene divisores 3 y 1323.> ./primo 7Determinando si 7 es primo:7 es primo.
Nota que el algoritmo ejecuta por mucho tiempo con primos y muy poco con números que tienendivisores pequeños. Se puede mejorar por manejar los pares aparte y por cambiar la cota superiordel while a uno que solamente avanza hasta la raíz cuadrada de la entrada. Estas modificacioneshacen que el algoritmo corre mucho más rápidamente, lo que se puede probar por ejemplo conla entrada 3457, que sí es primo.
7.2.3. Perl
Perl es un lenguaje script, esto es el código se compila antes de ejecutarlo, a diferencia de otroslenguajes como C, en donde el código se compila y traduce a lenguaje maquina.
Script básico
El siguiente script ilustra el uso del lenguaje Perl. La primera línea del script debe contenerlos caracteres de #! seguidos de la ruta en donde se encuentra el ejecutable de perl, con esto ledecimos a la maquina que el script lo interpretará con perl.
#!/usr/bin/perlprint "Hola mundo";
Perl
Otro lenguaje script
Bastante popular
Poderoso, pero a veces difícil de leer si el programador no se esfuerza por la claridad
Aritmética parecida a la del C
Buen manejo de cadenas y arreglos
foreachEjemplo de Dexmont Peña
CAPÍTULO 7. PROGRAMACIÓN 146
7.2.4. Sintaxis
Comentarios
Para comentar en perl es necesario colocar el caracter #, todo el texto que se encuentre despuesde este caracter será tomado como comentario.
7.2.5. Variables Escalares
Las variables escalares pueden contener enteros, reales, cadenas o referencias. El nombre de lavariable va precedido por el signo de pesos ($). En Perl las variables se declaran con la palabraclave my, sin embargo no necesitan ser declaradas. Por ejemplo,
#!/usr/bin/perl
#Declaro una variablemy $hola;
#Asigno valores$hola="Hola Mundo\n";$adios="adios\n";
#Escribimos un poco en pantallaprint $hola;$hola=23;print "Mira un n\’{u}mero: $hola \n";print "Y $adios";
Operadores de variables escalares
El operador de asignación es el símbolo =, como se puede obervar en el primer ejemplo de lapágina. También se pueden mezclar operadores ariméticos junto con la asignación. Por ejemplo,
#!/usr/bin/perl
#Asigno valores a variablesmy $uno=123.67;$dos=123123.2334;$suma=$uno;$suma+=$dos;
#Escribimos resultados en pantallaprint "La suma de $uno y $dos es = $suma \n";
Además se tienen los operadores autoincremento (++), autodecremento (–), potencia (**). Porejemplo,
#!/usr/bin/perl
Otro ejemplo en http://it.ciidit.uanl.mx/~elisa/teaching/prog/cap/calif.pl
Python
Languaje script del paradigma imperativo
Su popularidad crece rápidamente
Muchas librerías y software de código abierto disponible
Multiplataforma
Más detalle sobre Python en la unidad Programación Web
tcl
tclsh
la combinación ;# marca el inicio de un comentario
imprimir con la instrucción puts
asignación de variables con la instrucción setlectura de sus valores con $ y nombre de variable
todo se maneja como si fuera una cadena
expr evalua expresiones lógicas y aritméticasset c [expr {$a + $b}]
operadores y funciones matemáticas parecidos a C
http://www.tcl.tk/man/tcl/tutorial/tcltutorial.html
Más tcl
if-else y while similares al C
usando {} para la condición
en su for, cada una de las cuatro partes de la estructura lleva sus propias {}
incr i es la manera de lograr un i++ del C
en su switch, no se usa palabra clave para los casos, pero la operación es similar
subrutinas con proc
listas y arreglos
Tk
permite la creación de interfaces visuales
combina con tcl, Perl, Python y Ruby
funciona en linux, Mac y Windows
http://www.tkdocs.com/tutorial/
#!/usr/bin/python
from Tkinter import *
ventana = Tk()
ventana.title("Registro")
nombre = StringVar()
email = StringVar()
instNombre = Label(ventana, text="Nombre: ")
instNombre.pack()
campoNombre = Entry(ventana, textvariable=nombre)
campoNombre.pack()
instCorreo = Label(ventana, text="Correo: ")
instCorreo.pack()
campoCorreo = Entry(ventana, textvariable=email)
campoCorreo.pack()
listo = Button(ventana, text="Listo", command=ventana.quit)
listo.pack()
ventana.mainloop()
print nombre.get()
print email.get()
Ejemplo Tk + Python
http://infohost.nmt.edu/tcc/help/pubs/tkinter/
JavaScript
Lenguaje script para incrustar en HTML
Sintaxis parecido a Java
Se recomienda evitar su uso (exceso)
Problemas de accessibilidad, seguridad y usabilidad
Existen alternativas más elegantes (PHP, Python, JSP)
<html><body><h1>Fibonacci</h1><p><script>var curr = 1;var prev = 0;document.write("F(0) = 0<br>F(1) = 1<br/>");for (i = 2; i < 20; i++) { document.write("F(" + i + ") = " + (curr + prev) + "<br/>"); temp = prev + curr; prev = curr; curr = temp;}</script></p></body></html>
Programación matemática
MATLAB (comercial), Octave (abierto)
notación parecida al lenguaje C
Mathematica
Maple
Ejemplo en octave
http://www.network-theory.co.uk/docs/octave3/
function [min, pos] = minpos(datos) pos = 1; min = datos(pos); for i = 2:length(datos) if (v(i) < min) min = datos(i); pos = i; endif endforendfunction