lenguajes script (g)awk · python tcl/tk javascript • ... bloques para operaciones iniciales y...

3
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}’ > less total.awk #!/bin/awk -f {print $5; total = total + $5} END {print "Total = " total} > chmod u+x total.awk > ls -l | ./total.awk 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) lines=‘wc -l $file | awk ’{print $1}’‘ echo "El archivo" $file "tiene" $lines "lineas." sum=‘expr $sum + $lines‘ count=‘expr $count + 1‘ done echo "En total son" $sum "lineas en los" $count "archivos." prom=‘expr $sum / $count‘ echo "Promedio redondeado:" $prom exit 0 echo "hola", $1 echo "la fecha y hora actual:" date sum=0 count=0 for file in ‘ls -1‘ do cont=si n=$1 i=2 # mientras i es menor que n while [ $i -lt $n ] do # dividimos por i div=‘expr $n / $i‘ # calculamos el producto del resultado con i prod=‘expr $div ’*’ $i‘ # tomamos la diferencia mod=‘expr $n - $prod‘ # si el diferencia es cero if [ $mod -eq 0 ] then echo $n "no es primo, tiene divisores" $i "y" $div"." exit 0 fi i=‘expr $i + 1‘ done echo $n "es primo." exit 0

Upload: vuongnhu

Post on 25-Sep-2018

230 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lenguajes script (g)awk · Python Tcl/Tk JavaScript • ... bloques para operaciones iniciales y finales separa texto en columnas a base de un delimitador ... El archivo countsize

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";

Page 2: Lenguajes script (g)awk · Python Tcl/Tk JavaScript • ... bloques para operaciones iniciales y finales separa texto en columnas a base de un delimitador ... El archivo countsize

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/

Page 3: Lenguajes script (g)awk · Python Tcl/Tk JavaScript • ... bloques para operaciones iniciales y finales separa texto en columnas a base de un delimitador ... El archivo countsize

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