0% encontró este documento útil (0 votos)
60 vistas

Perl

1) El documento presenta cuatro programas en PERL, incluyendo uno que encuentra números primos usando el algoritmo de Eratóstenes y otros que conectan aplicaciones. 2) También describe un programa sencillo que suma dos números y otra solución más elegante que llama repetidamente al programa usando un archivo de datos. 3) Finalmente, presenta un programa en PERL para generar una imagen PGM.

Cargado por

Alvaro Telles
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
60 vistas

Perl

1) El documento presenta cuatro programas en PERL, incluyendo uno que encuentra números primos usando el algoritmo de Eratóstenes y otros que conectan aplicaciones. 2) También describe un programa sencillo que suma dos números y otra solución más elegante que llama repetidamente al programa usando un archivo de datos. 3) Finalmente, presenta un programa en PERL para generar una imagen PGM.

Cargado por

Alvaro Telles
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 3

Unos programas en PERL

Luis Gerardo de la Fraga 9 de agosto de 2002

Resumen
Se presentan cuatro programas de PERL. En el primero se introducir el uso de PERL prograa mando el algoritmo de Erat stones para hallar o n meros primos. En los siguientes tres prograu mas se visualizar el poder de este lenguaje como a un medio para conectar varias aplicaciones.

2 Numeros primos
La forma m s simple de hallar un n mero pria u mo es por medio del algoritmo de la criba de Erat stones: se divide n por todos los n meros o u hasta n . Erat stenes es un astr nomo y poeta o o griego quien hace m s de dos mil a os calcul la a n o medida de la cincumferencia de la Tierra con un error del 2% de su valor real. El algoritmo de Erat stones queda en pseuo doc digo como sigue: o 1. Se tiene un arreglo, p[], de tama o n. n 2. Se llena cada celda del arreglo con el mismo ndice n 3. Se calcula k = 4. Para cada entero 2 i k y donde p[i] no tenga marca: (a) Se pone una marca en todos los m ltiplos de i. u 5. Los n meros primos menores a n est n el luu a gar del arreglo p[] en donde no hay marca. Y realizando la codicaci n en PERL del pseuo doc digo de arriba para encontrar los n mero prio u mos menores a n, se obtiene lo siguiente:
#!/usr/bin/perl # Algorimto de Eratstenes para hallar o # los nmeros primos menores a n u # # Fraga 24/07/2002 $n = 50; # El valor de n

Introducci n o

PERL es un lenguaje de muy alto nivel, en donde no debemos teclear tantas instrucciones para realizar lo que queramos. En PERL no hay declaracion de variables. S lo o existen tres tipos de datos: variable simples, arreglos y tablas de hash (semejantes a un arreglo, s lo que el ndice puede ser cualquer cosa). Y o su sintaxis es muy parecida a la del lenguaje C, excepto que todas las variables deben comenzar con el signo $ y las llaves {} son obligatorias para indicar inicio y n de bloque (en C, si el bloque consiste de una sola sentencia, ella misma forma el n de bloque). El programa Hola mundo en PERL puede verse en la Fig. 1.
#!/usr/bin/perl print "Hola mundo\n";

Figura 1: El programa hola mundo en PERL Si salvamos este programa en un archivo llamado hola.pl, para poderlo ejecutar debemos cambiarle los permisos y ejecutarlo propiamente de la siguiente manera: $ chmod 700 hola.pl $ ./hola.pl 1

for ( $i=1; $i<=$n; $i++ ) { $p[$i] = $i;

} $k = int( sqrt($n) ); $i=2; while ( $i <= $k ) { while ( $p[ $i ] == 0 ) { $i ++; } # los mltiplos de $i u for ( $j=2; $j<=$n; $j++ ) { $a = $i * $j; $p[ $a ] = 0; } $i++; } # Imprimimos los nmeros encontrados u for ( $i=1; $i<=$n; $i++ ) { if ( $p[$i] != 0 ) { printf ( "%d\n", $p[$i] ); } }

$#ARGV == 1, estos son n meros que se van a u sumar. Y si no se dan argumentos se pregunta por cada n mero. Al nal imprime los dos n meros y u u su suma.

4 Llamadas repetidas al programa


C mo llamar varias veces al programa? Hay dos o soluciones. La primera es hacer otro programa en PERL que llame las veces necesarias al programa prog:
#!/usr/bin/perl # Primera opcion para llamar # al programa prog prog 1 2 > sale; prog 3 4 >>sale; prog 5 6 >>sale; prog 7 8 >>sale;

Una programa que suma dos numeros

La salida de este programa se almacena en el archivo sale que se muestra a continuaci n. o


1 3 5 7 + + + + 2 4 6 8 = = = = 3 7 11 15

Este es un programa simple, le llamaremos prog:


#!/usr/bin/perl # # Fraga 23/03/1999 # if ( $#ARGV == 0 ) { die "Args: a b\n"; } elsif ( $#ARGV == 1 ) { $a = $ARGV[0]; $b = $ARGV[1]; } else { print "De el valor de a = "; $a = <STDIN>; chop $a; print "De el valor de b = "; $b = <STDIN>; chop $b; } $c = $a + $b; print "$a + $b = $c\n";

5 Otra soluci n o
Una soluci n m s elegante para llamar repetidas o a veces al programa prog es crear un archivo con la lista de argumentos, en este caso ser n paa res de n meros que guardaremos en el archivo u data.txt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Su l gica es simple: si se da un solo aro gumento, $#ARGV == 0, el programa termina. Si se dan dos argumentos al programa, 2

Y creamos un programa en PERL, supongamos que se llama p1, que recibe como argumento el nombre del archivo con los datos. El programa p1 quedara como:

#!/usr/bin/perl # Segunda opcion para llamar # al programa prog die "Sin argumento me lamento\n" if ( $#ARGV < 0 ); open( INPUT, "$ARGV[0]" ) or die "Cant open $ARGV[0] file\n"; if ( -e "sale" ) { unlink "sale"; } while ( <INPUT> ) { chop; prog $_ >> sale; } close INPUT;

$rows = 256; $cols = 256; if ( $rows > $cols ) { $center = ($cols - 1 )/2; } else { $center = ($rows - 1 )/2; } for ( $i=0; $i<$rows; $i++ ) { $di = $center - $i; $di2 = $di * $di; for ( $j=0; $j<$cols; $j++ ) { $dj = $center - $j; $dj2 = $dj * $dj; $val = sqrt ( $di2 + $dj2 ); # Putting image values $img[ $cols * $i + $j ] =255-int($val); } } $val = save_pgn_img(\@img,$rows,$cols, "test.pgm"); if ( !$val ) { printf "Alls ok!\n"; } else { print "You have problems...\n"; } # Subroutine to save a image in ASCII PGM format # (see pgm man pages on NETPBM package) sub save_pgn_img (\@$$$) { # ( @img, $rows, $cols, $filename ); local (*myimg) = shift(@_); my $mycols = shift(@_); my $myrows = shift(@_); my $filename = shift(@_); my $n = @myimg; printf "$n $mycols $myrows $filename\n"; open ( MYFILE, ">$filename" ) or return 1; print print print print MYFILE MYFILE MYFILE MYFILE "P2\n"; "# file: $filename\n"; "$mycols $myrows\n"; "255\n";

Y la salida al ejecutar este programa como p1 data.txt queda guardada en el archivo sale. El contenido de sale es:
1 + 2 = 3 3 + 4 = 7 5 + 6 = 11 7 + 8 = 15 9 + 10 = 19 11 + 12 = 23 13 + 14 = 27 15 + 16 = 31 17 + 18 = 35

Y aqu vemos como PERL nos ayuda a pegar el programa prog con los datos en el archivo data.txt. Es la exibilidad y el poder de la programaci n en un lenguaje de muy alto nivel. o

Ejemplo de un programa en PERL para generar una imagen PGM


#!/usr/bin/perl # # # # # # # # # # # Perl program to construct a test image. Output: test.pgm image. Input: Its necessary edit $rows and $cols values by hand Could be much more easy to use the command: pgmramp -ellipse 256 256 > output_image.pgm (pgmramp is part of NETPBM package) Fraga April, 2001 }

for ( my $i=1; $i <= $myrows*$mycols; $i++ ) { printf( MYFILE "%3d ", $myimg[$i-1] ); if ( !($i%17) ) { print MYFILE "\n"; } } close MYFILE; return 0;

También podría gustarte