Creo que no... al final, en las dos soluciones, debes usar una condición para saber dónde dejar el registro.
Se puede "esconder" el procedimiento ocultando y compactando código, pero... no queda muy claro...
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
open my $fasta, q[<], 'fasta1.txt' or die "$!\n";
local $/ = undef;
my $fichero = <$fasta>;
close $fasta;
print "$fichero\n";
my @numeros;
my @letras;
while ($fichero =~ />.*?$([^>]+)>.*?$([^>]+)/gsmo) {
my ($numeros,$letras) = ($1, $2); # Los dos registros capturados
$numeros =~ s/\s*//g; # les quitamos los espacios y finales de línea
$letras =~ s/\s*//g;
push @numeros, $numeros; # lo guardamos
push @letras, $letras;
}
use Data::Dumper;
print Dumper \@numeros;
print Dumper \@letras;
__END__
>NUMEROS
12345
67891
>LETRAS
ABCDE
FGHIJ
>NUMEROS
12345
67891
>LETRAS
ABCDE
FGHIJ
$VAR1 = [
'1234567891',
'1234567891'
];
$VAR1 = [
'ABCDEFGHIJ',
'ABCDEFGHIJ'
];
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Esta solución usa una expresión regular para capturar dos registros contiguos.
Esta otra es aún más compacta, generando una estructura de datos de un
array de
array:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
open my $fasta, q[<], 'fasta1.txt' or die "$!\n";
local $/ = undef;
my $fichero = <$fasta>;
close $fasta;
print "$fichero\n";
my @registros;
my $i = 0;
while ($fichero =~ />.*?$([^>]+)/gsmo) {
my $registro = $1; # lo capturado
$registro =~ s/\s*//g; # quitamos los espacios y finales de línea
push @{$registros[$i % 2]}, $registro; # lo guardamos según el valor de $i
$i++; # contador
}
use Data::Dumper;
print Dumper \@registros;
__END__
>NUMEROS
12345
67891
>LETRAS
ABCDE
FGHIJ
>NUMEROS
12345
67891
>LETRAS
ABCDE
FGHIJ
$VAR1 = [
[
'1234567891',
'1234567891'
],
[
'ABCDEFGHIJ',
'ABCDEFGHIJ'
]
];
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Yo creo que quede más clara la opción primera, la de la variable que hace de indicador.