Para pedir al sistema operativo que ejecute otros programas desde un programa en Perl podemos hacerlo de varias maneras. Al hacerlo estamos en realidad llamando al sistema operativo y esperando su respuesta:
## insertando el comando y sus parametros entre dos `acentos graves` my $resultado = `ls -l *.fas`; # muestra todos los archivos FASTA del directorio actual $resultado = `df -k`; # muestra el espacio libre en los sistemas de ficheros de tu sistema $resultado = `cat archivo.pdb | grep ATOM`; # imprime lineas 'ATOM' de un PDB ## usando la funcion system() $resultado = system("cat archivo.pdb | grep ATOM"); $resultado = system("pwd"); # devuelve el directorio actual $resultado system("zcat archivo.fas.gz"); # descomprime un archivo y muestra el contenido if($? != 0) { die "# ERROR: zcat call failed\n"; }
Perl incorpora todo un conjunto de funciones que nos permiten interaccionar con el sistema operativo, que podéis ver íntegro en la guía de referencia de Perl. Yo destacaría:
chdir $otroDir; # cambia de directorio durante la ejecucion de un programa kill $IDproceso; # termina otros procesos que hayas creado anteriormente sleep $segundos; # para temporalmente la ejecucion del programa que la invoca
Hay otra manera muy útil de ejecutar otros programas desde Perl y directamente procesar su salida, usando las tuberías '|' ( pipes ) de UNIX*. De esta manera, la salida generada por el proceso ejecutado es vista desde Perl como un archivo. Veamos ejemplos:
open(BLAST,"psiblast -in secuencia.fas |") || die "no puedo ejecutar psiblast\n"; while(<BLAST>) { # lee la salida de BLAST directamente, sin guardarla en un archivo } close(BLAST); open(ZCAT,"zcat gran_archivo.gz |") || die "no puedo descomprimir gran_archivo.gz\n"; while(<ZCAT>) { # voy leyendo el contenido de gran_archivo, pero el archivo sigue comprimido en el sistema } close(ZCAT);
Bruno Contreras-Moreira