######################################################################################################### ################################### P R O G R A M A 2 ################################################# ######################################################################################################### #!/usr/bin/perl -w use strict; ## DEFINICIO DE VARIABLES my $fitxer; ## emmagatzema el fitxer de dades d'entrada my $k; ## registra la longitud del motiu que busquem my $branch; ## enregistra el $branch, si existeix my $intro; ## per l'intro actual, emmagatzema l'especie my $sp; ## per l'intro actual, enregistra el nom d'intro my $seq; ## per l'intro actual, enregistra la sequencia de nucleotids my @subSc; ## guarda k-amers de $seq per 'Sc' my @substar; ## guarda k-amers de $seq per 'star' my $c; ## index per recorrer @subSc my $m; ## index per recorrer @subSc i @subseq, posicio anterior al branch my %comptar; ## hash que enregistra i compta K-amers conservats my @keys; ## vector per trobar les claus del hash %hash my $x; ## index per recorrer @keys if(scalar(@ARGV)<2){ print"Escriu: perl segon.pl infile.txt longitud\n"; exit (1); }; $fitxer = $ARGV[0]; $k = $ARGV[1]; if (!open(FITXER,"< $fitxer")){ print"segon.pl: impossible obrir $fitxer\n"; exit (1); }; ## RECORRE EL FITXER $branch = 0; while(){ chomp; $m = 6; $c = 6; ## EMMAGATZEMA EL BRANCH, si hi es if ($_ =~/\A\S+\sbranch\s(\d+)\Z/g){ $branch = $1; }; ## TROBA I RECORRE LA SEQUENCIA DE Sc if ($_=~/(\S+)\sSc\s([ACTG-]+)/g){ $intro = $1; $seq = $2; $sp = 'Sc'; ## si no te branch if ($branch == 0){ while($c <= (length($seq) - ($k+3))){ $subSc[$c]= substr($seq,$c,$k); $c = $c + 1; }; }; ## si te 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; }; }; }; ## TROBA I RECORRE LA SEQUENCIA D'ASTERISCS if ($_=~/(\S+)\sstar\s([\* ]+)/g){ $intro = $1; $seq = $2; $sp = 'star'; ## si no te 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 TROBA UNA SEQUENCIA CONSERVADA, LA GUARDA A %COMPTAR I LI SUMA 1 if (!exists $comptar{$subSc[$m]}){ $comptar{$subSc[$m]} = 0; }; $comptar{$subSc[$m]} = $comptar{$subSc[$m]} + 1; }; $m = $m + 1; }; }; ## si te 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 TROBA UNA SEQUENCIA CONSERVADA, LA GUARDA A %COMPTAR I LI SUMA 1 if (!exists $comptar{$subSc[$m]}){ $comptar{$subSc[$m]} = 0; }; $comptar{$subSc[$m]} = $comptar{$subSc[$m]} + 1; }; }; $m = $m + 1; }; }; $branch = 0; }; }; ## ORDENA I MOSTRA @keys = sort { $comptar{$b} <=> $comptar{$a} } (keys(%comptar)); $x=0; while ($x < scalar(@keys) ) { print$keys[$x],"\t",$comptar{$keys[$x]},"\n"; $x = $x + 1; };