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