######################################################################################################### ################################### P R O G R A M A 2 ################################################# ######################################################################################################### #!/usr/bin/perl -w use strict; ## DEFINICION DE VARIABLES my $fichero; ## almacena el fichero de datos que entran my $k; ## almacena la longitud del motivo que buscamos my $branch; ## almacena el $branch, si existe my $intron; ## para el intros actual, almacena la especie my $sp; ## pars el intron actual, almacena el nombre del intron my $seq; ## para el intron actual, almacena la secuencia de nucleotidos my @subSc; ## guarda k-ameros de la secuencia 'Sc' my @substar; ## guarda k-ameros de la secuencia 'star' my $c; ## indice para recorrer @subSc my $m; ## indice para recorrer @subSc y @subseq, posicion anterior al branch my %contar; ## hash que almacena y cuenta k-ameros conservados my @keys; ## vector per encuentra las claves del hash %hash my $x; ## indice para recorrer @keys if(scalar(@ARGV)<2){ print"Escribe: perl segundo.pl infile.txt longitud\n"; exit (1); }; $fichero = $ARGV[0]; $k = $ARGV[1]; if (!open(FITXER,"< $fichero")){ print"segundo.pl: imposible abrir $fichero\n"; exit (1); }; ## RECORRE EL FICHERO $branch = 0; while(){ chomp; $m = 6; $c = 6; ## ALMACENA EL BRANCH, si tiene if ($_ =~/\A\S+\sbranch\s(\d+)\Z/g){ $branch = $1; }; ## ENCUENTRA Y RECORRE LA SECUENCIA DE Sc if ($_=~/(\S+)\sSc\s([ACTG-]+)/g){ $intron = $1; $seq = $2; $sp = 'Sc'; ## si no tiene branch if ($branch == 0){ while($c <= (length($seq) - ($k+3))){ $subSc[$c]= substr($seq,$c,$k); $c = $c + 1; }; }; ## si tiene branch if ($branch > 0){ while( $c <= (length($seq) - ($k+3))){ if ( ( ($c + $k) <= $branch) || ($c > ($branch + 6))){ $subSc[$c] = substr($seq,$c,$k); }; $c = $c + 1; }; }; }; ## ENCUENTRA Y RECORRE LA SECUENCIA DE ASTERISCOS if ($_=~/(\S+)\sstar\s([\* ]+)/g){ $intron = $1; $seq = $2; $sp = 'star'; ## si no tiene branch if($branch == 0){ while($m <= (length($seq) - ($k+3))){ $substar[$m]=substr($seq,$m,$k); if (($substar[$m]=~ m/\*{$k}/g) && exists $subSc[$m]){ ## SI ENCUENTRA UNA SECUENCIA CONSERVADA, LA GUARDA EN %CONTAR Y LE SUMA 1 if (!exists $contar{$subSc[$m]}){ $contar{$subSc[$m]} = 0; }; $contar{$subSc[$m]} = $contar{$subSc[$m]} + 1; }; $m = $m + 1; }; }; ## si tiene branch if($branch > 0 ){ while( $m <= (length($seq) - ($k+3))){ if ( ( ($m + $k) <= $branch) || ($m > ($branch + 6))){ $substar[$m]=substr($seq,$m,$k); if (($substar[$m]=~ m/\*{$k}/g) && exists $subSc[$m] ){ ## SI ENCUENTRA UNA SECUENCIA CONSERVADA, LA GUARDA EN %COMPTAR Y LE SUMA 1 if (!exists $contar{$subSc[$m]}){ $contar{$subSc[$m]} = 0; }; $contar{$subSc[$m]} = $contar{$subSc[$m]} + 1; }; }; $m = $m + 1; }; }; $branch = 0; }; }; ## ORDENA Y MUESTRA @keys = sort { $contar{$b} <=> $contar{$a} } (keys(%contar)); $x=0; while ($x < scalar(@keys) ) { print$keys[$x],"\t",$contar{$keys[$x]},"\n"; $x = $x + 1; };