La verdad es que mi nivel de Perl es bastante básico. Estoy haciendo un script que en principio no debería ser muy complicado.
Lo que tengo es un fichero del que solo me interesan unas determinadas filas. Una vez identificadas esas filas guardo en diferentes variables el contenido de éstas (en principio el script lo hace bien), luego tengo otro fichero en el que hago algo similar (solo que esta vez me interesan todas las filas, lo único que hago es guardar su contenido en variables).
Mi problema viene al comparar dos variables que he guardado de estos ficheros. Comparar, compara, pero no lo hace bien, pierdo cosas en el camino.
Using perl Syntax Highlighting
#!/usr/bin/perl
#recoge los nombres de los ficheros en la linea de comando
if ( (!$ARGV[0])|| (!$ARGV[1])||(!$ARGV[2])){
print "La linea de ejecución del programa debe ser: ortologos.pl genesZfin.tsv moddanre.txt ortologos.txt\n";}
$ficherouno = $ARGV[0];
$ficherodos = $ARGV[1];
$ficherotres = $ARGV[2];
$y=1;
$x=1;
$b=1;
$n=1;
$m=1;
$i=1;
open(geneszfin,"$ficherouno") or die "problemas abriendo el fichero $ficherouno\n";
while (<geneszfin>){
chomp $_;
if($_=~/^\w/){
chomp $_;
my ($genzfin,$ref,$stage,$r,$idzfin)=split(/\t/,$_);
$datozfin[$y]=$idzfin."\t".$genzfin."\t".$stage;
$zfin[$y]=$idzfin;
$y=$y+1;
next;}
last if ($_=~/^FIN/);
}
print tres "FIN\n";
close(geneszfin);
$y=$y-1;
print "$y y $zfin[$y]\n";
open(moddanre,"$ficherodos")or die "problemas abriendo el fichero $ficherodos\n";
while(<moddanre>){
chomp $_;
if($_=~/^ZDB/){
chomp $_;
my ($identificador,$scorea,$r,$id,$scoreb)=split(/\t/,$_);
if (($identificador=~/ZDB/)&&($scorea=~/100/) &&($scoreb=~/100/)){
$dato[$x]=$identificador."\t".$scorea."\t".$id."\t".$scoreb;
$idanimala[$x]=$identificador;
$x=$x + 1;
next;}
}
last if ($_=~/^FIN/);
}
close(moddanre);
$x=$x-1;
print "$x y $idanimala[$x]\n";
for ($a=1;$a<=$x;$a++){
for($b=1;$b<=$y;$b++){
if ($zfin[$b]=~/$idanimala[$a]/){
$match[$n]=$dato[$b];
$n=$n+1;}
}
}
$n=$n-1;
$m=$m-1;
print "$n $match[$n] y $m $mismatch[$m]\n";
open(ortologos,">$ficherotres") or die "problemas abriendo el fichero $ficherotres\n";
print ortologos "Grupos de ortologos presentes en nuestra lista de Zebra Fish\n";
for ($a=1;$a<=$n;$a++){
print ortologos "$match[$a]\n";}
print tres "FIN\n";
close(ortologo);
exit;
#recoge los nombres de los ficheros en la linea de comando
if ( (!$ARGV[0])|| (!$ARGV[1])||(!$ARGV[2])){
print "La linea de ejecución del programa debe ser: ortologos.pl genesZfin.tsv moddanre.txt ortologos.txt\n";}
$ficherouno = $ARGV[0];
$ficherodos = $ARGV[1];
$ficherotres = $ARGV[2];
$y=1;
$x=1;
$b=1;
$n=1;
$m=1;
$i=1;
open(geneszfin,"$ficherouno") or die "problemas abriendo el fichero $ficherouno\n";
while (<geneszfin>){
chomp $_;
if($_=~/^\w/){
chomp $_;
my ($genzfin,$ref,$stage,$r,$idzfin)=split(/\t/,$_);
$datozfin[$y]=$idzfin."\t".$genzfin."\t".$stage;
$zfin[$y]=$idzfin;
$y=$y+1;
next;}
last if ($_=~/^FIN/);
}
print tres "FIN\n";
close(geneszfin);
$y=$y-1;
print "$y y $zfin[$y]\n";
open(moddanre,"$ficherodos")or die "problemas abriendo el fichero $ficherodos\n";
while(<moddanre>){
chomp $_;
if($_=~/^ZDB/){
chomp $_;
my ($identificador,$scorea,$r,$id,$scoreb)=split(/\t/,$_);
if (($identificador=~/ZDB/)&&($scorea=~/100/) &&($scoreb=~/100/)){
$dato[$x]=$identificador."\t".$scorea."\t".$id."\t".$scoreb;
$idanimala[$x]=$identificador;
$x=$x + 1;
next;}
}
last if ($_=~/^FIN/);
}
close(moddanre);
$x=$x-1;
print "$x y $idanimala[$x]\n";
for ($a=1;$a<=$x;$a++){
for($b=1;$b<=$y;$b++){
if ($zfin[$b]=~/$idanimala[$a]/){
$match[$n]=$dato[$b];
$n=$n+1;}
}
}
$n=$n-1;
$m=$m-1;
print "$n $match[$n] y $m $mismatch[$m]\n";
open(ortologos,">$ficherotres") or die "problemas abriendo el fichero $ficherotres\n";
print ortologos "Grupos de ortologos presentes en nuestra lista de Zebra Fish\n";
for ($a=1;$a<=$n;$a++){
print ortologos "$match[$a]\n";}
print tres "FIN\n";
close(ortologo);
exit;
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4
¡¡Gracias y saludos!!