No es tan sencillo...
No puedes sacar la información por cada línea, hasta que no hayas leído todas las líneas, porque no sabes cuántas columnas tienes.
Entonces... tienes que leer todos los archivos, y guardarlos en una estructura bidimensional, en donde las filas son cada gen, y cada columna, el número de archivo leído. Si un elemento no está definido, entonces sabemos que no fue leído, y le ponemos a '1'. Y lo mismo hay que hacer para las columnas finales, que también pueden haber estado vacías.
Esta es mi solución. Naturalmente, se puede hacer de muchas otras maneras.
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
#use strict;
#use warnings;
#use diagnostics;
use autodie; # es mejor morir que regresar con deshonor (proverbio Klingon)
my %matriz; # guardaremos la información aquí
my $col = 0; # número de columnas por línea
for my $file_tbl (<*.tbl>) {
open my $TBL, '<', $file_tbl;
while (<$TBL>) {
next unless /^EN/;
chomp;
my($gen, $value) = split;
$matriz{$gen}[$col] = $value; # almacenamos el valor, en la fila $gen, y columna $c
}
close $TBL;
$col++; # siguiente columna
}
for my $gen (sort keys %matriz) { # impresión de los datos
print $gen; # nombre del gen
for my $item (@{$matriz{$gen}}) {
$item //= 1; # si el elemento no está definido, lo ponemos a '1'
print "\t$item";
}
for (@{$matriz{$gen}} .. $col-1) {
print "\t1"; # resto de elementos de la fila, también a '1'
}
print "\n";
}
__END__
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Aquí estamos usando el operador // (nuevo en Perl v5.10) para saber si una variable contiene un valor definido, o no.