Llamadas al sistema operativo

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
http://www.eead.csic.es/compbio