Formateo de datos

Ya hemos usado en diferentes ejemplos la función print. Esta función puede usarse para dar formato a los datos que queremos imprimir en un programa. Una manera práctica muchas veces utilizada en bioinformática es imprimir datos en un archivo por columnas, de forma que todas las líneas tengan el mismo número de columnas. Como separadores de columnas pueden utilizarse carácteres como \t (tabulador), espacios en blanco o comas:

print "$nombreGen \t $GC \t $longitud \t $especie\n";
print "$nombreGen $GC $longitud $especie\n";
print "$nombreGen,$GC,$longitud,$especie\n";

Este tipo de formatos de salida son ideales para que otros programas en Perl, por medio de la función split, puedan leerlos. De hecho son también adecuados para que aplicaciones como Excel u OpenOffice puedan abrir estos archivos.

Sin embargo, a veces es realmente importante, como en el formato PDB, que cada elemento de datos ocupe un grupo de columnas específico de una línea de archivo. En este caso es recomendable el uso de la función printf .

printf es muy similar (no sé si idéntica) a la misma función del lenguaje C y su uso es relativamente sencillo. Su síntaxis es:

printf("cadena formateada %s %1.2f",$escalar1,$escalar2,...);
Dentro de la cadena de caracteres formateada se puede hacer referencia a escalares que queramos formatear. Cada una de estas referencias comienza con el símbolo % y deberá haber tantas como escalares separados por comas en la parte izquierda de la llamada a printf. Además, cada referencia debe especificar el formato de salida deseado:
%c        # el caracter correspondiente a un codigo ASCII
%s        # una cadena de caracteres (string)
%d        # un entero
%f        # un real con coma fija
%g        # un real con decimales
%e        # un real en notacion cientifica mantisa y exponente, como 1.204e-23
%x        # un hexadecimal

Modificadores:
-      # justifica a la izquierda
+      # obliga a imprimir el signo
.      # fuerza un min de columnas para un campo
0      # usa ceros para justificar a la derecha
 
Ejemplos:
 
printf("%1.2f",$real);           # un real de que ocupe al menos 1 columna 
                                 # y tenga max 2 decimales

printf("%.10s",$cadena);         # cadena de no mas de 10 columnas

Finalmente, Perl incluye la posibilidad de definir formatos de otra manera, usando las funciones format y write, que entenderemos mejor con un ejemplo:

#!/usr/bin/perl -w 
# Ejemplo escrito por Bruno Contreras

use strict; 

my ($nombre,$especie,$peso);

## defino un formato y le pongo nombre
# < justifica a la izquierda, > a la derecha , #. definen los campos de numeros
# | se usaria para centrar contenido
format MIFORMATO =
Proteina=@<<<<<<<<  Organismo=@>>>>>>>>>>>>  Peso molecular=@###.#KDa
           $nombre,             $especie,                   $peso
.			   

## abro el archivo de salida con un descriptor cuyo nombre coincida 
## con el formato de salida
open(MIFORMATO,">salida.txt") || die "no puedo crear salida.txt\n";

## aquí asigno valores a las variables del formato, normalmente será un bucle
$nombre  = "1lfu";
$especie = "M.musculus";
$peso    = "124.456";

write (MIFORMATO);
## imprime en el archivo de salida
## 'Proteina=1lfu       Organismo=   M.musculus  Peso molecular= 124.5KDa'


## cierro el archivo de salida
close(MIFORMATO);

Yo apenas he usado la combinación format/write, así que os recomiendo, si os interesa usarlos, leer este documento.

Bruno Contreras-Moreira
http://www.eead.csic.es/compbio