Introdução à Programação de Computadores para Biologia Subrotinas FUNÇÕES PRÉ-DEFINIDAS Código para realizar uma tarefa específica Exemplos de funções que já vimos $newstring = substr ($str,1,4); @array = split (/\t/,$line); #retorna uma substring #quebra uma linha em um array push (@array, $num); #encaixa uma variável no fim #de um array chop($string); $primeiro = shift(@array); # remove último caracter # remove e retorna o primeiro # elemento de um array 1
FUNÇÕES PRÉ-DEFINIDAS Código para realizar uma tarefa específica Funções tem argumentos e retornam valores $newstring = substr ($str,1,4); Valor retornado: A função substr retorna uma string Argumentos: (STRING, INÍCIO, COMPRIMENTO) Função definida pelo usuário 2
Função definida pelo usuário Organização (manter, atualizar, compar@lhar) Divisão de trabalho (simplificar) sub SUB_NAME { # Fazer alguma coisa sub printhello { print "Hello World!\n"; sub bark { print "Au-Au\n"; Função definida pelo usuário Organização (manter, atualizar, compar@lhar) Divisão de trabalho (simplificar) 3
Definição pelo usuário Em qualquer ponto do script Geralmente, todas juntas, no início ou fim # Sintaxe da definicao de subrotinas, separadas do script principal # Antes de cada subrotina, um comentario detalhado com o nome da subrotina, sua funcao, os inputs e outputs sub subname { # Bloco de comandos para fazer alguma coisa # Nao esquecer a indentacao! Definição pelo usuário Em qualquer ponto do script Geralmente, todas juntas, no início ou fim # Sintaxe da definicao de subrotinas, separadas do script principal # Antes de cada subrotina, um comentario detalhado com o nome da subrotina, sua funcao, os inputs e outputs sub subname { # Bloco de comandos para fazer alguma coisa # Nao esquecer a indentacao! 4
Definição pelo usuário Em qualquer ponto do script Geralmente, todas juntas, no início ou fim # Sintaxe da definicao de subrotinas, separadas do script principal # Antes de cada subrotina, um comentario detalhado com o nome da subrotina, sua funcao, os inputs e outputs sub subname { # Bloco de comandos para fazer alguma coisa # Nao esquecer a indentacao! Chamada da subrotina Em qualquer ponto do script Podem ser passados argumentos A subro@na pode retornar valores subname(); subname($arg, "arg", 1); $res = subname($arg, "arg", 1); @res = subname($arg, "arg", 1); # nao sao passados argumentos # nenhum valor eh retornado # sao passados 3 argumentos # nenhum valor eh retornado # sao passados 3 argumentos # retorna uma escalar # sao passados 3 argumentos # retorna um array 5
Utilização 1. No Eclipse, New > New Perl Project; aula08 2. No Eclipse, New > New Perl File; exemplo01.pl 2. Copiar #exemplo01 da página da disciplina; 3. U@lizar a subro@na em um script; 4. Qual a função da subro@na? Utilização Exemplo1.pl #/usr/bin/perl/ exemplo01(); sub exemplo01 { for ($i = 0; $i < 40; $i++) { $base = int(rand(4)); if ($base == 0) { print "A"; next; if ($base == 1) { print "T"; next; if ($base == 2) { print "C"; next; if ($base == 3) { print "G"; next; print "\n"; 6
Utilização Exemplo1.pl Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Darwin:~ Tatiana$ perl exemplo01.pl >>out.txt Utilização out.txt CAAACCAGCCCTGAGCGTCCGTTTACGAAACGACCGCCCA GTCGTGATCTGTAGATCGTACACGTGCCGCATTTTACAAT GGCCAGACGTGCGAGGAAAGTAGTAAAAGGCGATCTGTTG GATGTTTTAGTCATACCACCGATAGTTTCCTTGATGTCTT TTGGAATAGTATACTGTACGCTATTGCTGAGGTGCCGCCC TTTCTACAACGACTACTACGCCACCACTTCGGCGGGGTGC AATAAGGTCAATAGTGTTGATATTGCCTAATTTCGAAGTC CCCGTTCTGGTGGTCTCTAGCGCGCCCTCGGACGCCGACG AGTTCTTGGCTTCGGTTTGTTTGTCAGATTATGCGATTCA GATAACAACTCGATCCAGTACCTGTACCACGGTAGTCTCC 7
Argumentos No Eclipse, alterar a subro@na para passar como argumento, o tamanho desejado da sequencia; Use a subro@na passando o argumento de 100 nt. Variável @_ recebe os argumentos de subro@nas Argumentos No Eclipse, alterar a subro@na para passar como argumento, o tamanho desejado da sequencia; Use a subro@na passando o argumento de 100 nt. #/usr/bin/perl/ seqaleatoria(100); sub seqaleatoria { $tamanho = $_[0]; for ($i = 0; $i < $tamanho; $i++) { $base = int(rand(4)); if ($base == 0) { print "A"; next; if ($base == 1) { print "T"; next; if ($base == 2) { print "C"; next; if ($base == 3) { print "G"; next; print "\n"; 8
Alguns truques 1. No Eclipse, New > New Perl File; seqaleatoria.pl 2. Copiar #exemplo02 da página da disciplina; 3. Execute o script; 4. Qual a função do comando "$length = shir 40;"? 5. Qual a função do bloco "unless ($i%70) {print"\n";"? Alguns truques seqaleatoria.pl #/usr/bin/perl/ seqaleatoria(200); seqaleatoria(); sub seqaleatoria { $tamanho = shift 40; for ($i = 0; $i < $tamanho; $i++) { unless ($i%70) { print "\n" ; $base = int(rand(4)); if ($base == 0) { print "A"; next; if ($base == 1) { print "T"; next; if ($base == 2) { print "C"; next; if ($base == 3) { print "G"; next; print "\n"; 9
Alguns truques seqaleatoria.pl #/usr/bin/perl/ seqaleatoria(200); sub seqaleatoria { $tamanho = shift 40; for ($i = 0; $i < $tamanho; $i++) { unless ($i%70) { print "\n" ; $base = int(rand(4)); if ($base == 0) { print "A"; next; if ($base == 1) { print "T"; next; if ($base == 2) { print "C"; next; if ($base == 3) { print "G"; next; print "\n"; print vs return 10
print vs return 1. No Eclipse, New > New Perl File; exemplo01.pl 2. Copiar #exemplo03 da página da disciplina. 1. No Eclipse, New > New Perl File; soma.pl 2. Copiar #exemplo03 da página da disciplina. soma(12, 20); sub soma { ($n1, $n2) = @_; $res = $n1 + $n2; print $res; print vs return 11
print vs return E se quisermos u@lizar o valor da soma em outra etapa do script? $valor = soma(12, 20); $resultado = $valor*5; print "$resultado\n"; print vs return E se quisermos u@lizar o valor da soma em outra etapa do script? Alterar a subro@na soma para retornar o valor. $valor = soma(12, 20); $resultado = $valor*5; print "$resultado\n"; 12
print vs return E se quisermos u@lizar o valor da soma em outra etapa do script? Alterar a subro@na soma para retornar o valor. sub soma { ($n1, $n2) = @_; $res = $n1 + $n2; print $res; print vs return E se quisermos u@lizar o valor da soma em outra etapa do script? Alterar a subro@na soma para retornar o valor. $valor = soma(12, 20); $resultado = $valor*5; print "$resultado\n"; sub soma { ($n1, $n2) = @_; $res = $n1 + $n2; return $res; 13
print vs return seqaleatoria.pl #/usr/bin/perl/ seqaleatoria(200); sub seqaleatoria { $tamanho = shift 40; for ($i = 0; $i < $tamanho; $i++) { unless ($i%70) { print "\n" ; $base = int(rand(4)); if ($base == 0) { print "A"; next; if ($base == 1) { print "T"; next; if ($base == 2) { print "C"; next; if ($base == 3) { print "G"; next; print "\n"; print vs return Como u@lizar o resultado da subro@na seqaleatoria em uma segunda etapa do script? Exemplo 04, fazer complemento reverso: ALGORITMO: 1. Gerar sequência aleatória; 2. Inverter a sequência; 3. Gerar o complemento. 14
print vs return Como u@lizar o resultado da subro@na seqaleatoria em uma segunda etapa do script? Exemplo 04, fazer complemento reverso: ALGORITMO: 1. Gerar sequencia aleatória; 2. Inverter a sequencia; 3. Gerar o complemento. Copiar exemplo 4; Alterar a subro@na seqaleatoria para retornar a sequência gerada. comseqaleatoria.pl #/usr/bin/perl/ print vs return # gerar sequencia aleatoria com a subrotina seqaleatoria $tamanho = 200; $sequencia = seqaleatoria($tamanho); # inverter a sequencia $revseq = reverse($sequencia); # gerar o complemento reverso $revseq =~ tr/atcg/atcg/; # imprimir (fasta) print "\>seq\n"; for ($i = 0; $i < $tamanho; $i+=70) { print substr($revseq,$i,70), "\n"; 15
comseqaleatoria.pl print vs return sub seqaleatoria { $seq = ""; $tamanho = shift 40; for ($i = 0; $i < $tamanho; $i++) { $base = int(rand(4)); if ($base == 0) { $seq.= "A"; next; if ($base == 1) { $seq.= "T"; next; if ($base == 2) { $seq.= "C"; next; if ($base == 3) { $seq.= "G"; next; return $seq; Alguns truques 1. No Eclipse, New > New Perl File; local_global.pl 2. Copiar #exemplo05 da página da disciplina 16
GLOBAL vs LOCAL my vs our local_global.pl O que aconteceu com $valor? # $valor como variavel global $valor = 0; print "Antes da subrotina, valor \= $valor.\n"; soma(12, 20); print "Antes da subrotina, valor \= $valor.\n"; sub soma { ($n1, $n2) = @_; $valor = $n1 + $n2; GLOBAL vs LOCAL my vs our local_global.pl O que aconteceu com $valor? # $valor como variavel local $valor = 0; print "Antes da subrotina, valor \= $valor.\n"; soma(12, 20); print "Antes da subrotina, valor \= $valor.\n"; sub soma { ($n1, $n2) = @_; my $valor = $n1 + $n2; 17
Declarando variáveis GLOBAL vs LOCAL my vs our # Declarando variáveis my $x; # OK my $x, $y, $z; # INCORRETO my ( $x, $y, $z ); # OK my $x; my $y; my $z; # OK # Inicializando variáveis my $x = 0; # OK my $x = ""; # OK my $x = my $y = my $z = 0; # OK my $x = my $y = my $z = ""; # OK PERL SCRIPT ESTRUTURA Minha estrutura preferida: #!/caminho/para/perl # cabecalho do script # declaracao e inicializacao de variaveis # captura dos argumentos # corpo do script # subrotinas Ver exemplo06 na página da disciplina; 18
exemplo06: PERL SCRIPT ESTRUTURA ## --------------------------------------------------------------------- ## ## ## ## SCRIPT: seqaleatoria.pl 03.11.2014 ## ## ## ## DESCRIPTION: script para exemplificar subrotinas ## ## ## ## USAGE: perl seqaleatoria.pl ## ## ## ## AUTHOR: Tatiana Torres tttorres at ib.usp.br ## ## ## ## --------------------------------------------------------------------- ## use strict; ## Declaracao de variaveis my $tamanho; my $sequencia; my $revseq; exemplo06: PERL SCRIPT ESTRUTURA ## MAIN ## # criar a sequencia aleatoria $tamanho = 200; $sequencia = seqaleatoria($tamanho); # inverter a sequencia $revseq = reverse($sequencia); # gerar o complemento reverso $revseq =~ tr/atcg/atcg/; # imprimir (fasta) print "\>seq\n"; for (my $i = 0; $i < $tamanho; $i+=70) { print substr($revseq,$i,70), "\n"; 19
exemplo06: PERL SCRIPT ESTRUTURA ## ## ## subrotina para gerar sequencias aleatorias de nucleotideos ## argumento: tamanho da sequencia (numero de nucleotideos) ## retorna: string com uma sequencia aleatoria sub seqaleatoria { my $seq = ""; my $tamanho = shift 40; # default: $tamanho = 40 for (my $i = 0; $i < $tamanho; $i++) { my $base = int(rand(4)); if ($base == 0) { $seq.= "A"; next; if ($base == 1) { $seq.= "T"; next; if ($base == 2) { $seq.= "C"; next; if ($base == 3) { $seq.= "G"; next; return $seq; exemplo06: PERL SCRIPT ESTRUTURA ## ## ## subrotina para gerar sequencias aleatorias de nucleotideos ## argumento: tamanho da sequencia (numero de nucleotideos) ## retorna: string com uma sequencia aleatoria sub seqaleatoria { my $seq = ""; my $tamanho = shift 40; # default: $tamanho = 40 for (my $i = 0; $i < $tamanho; $i++) { my $base = int(rand(4)); if ($base == 0) { $seq.= "A"; next; if ($base == 1) { $seq.= "T"; next; if ($base == 2) { $seq.= "C"; next; if ($base == 3) { $seq.= "G"; next; return $seq; 20
PASSANDO ARGUMENTOS @_ e referências $valor = soma(1,4,6,7,9); Argumentos em @_: $_[0] tem valor 1 $_[1] tem valor 4 $_[2] tem valor 6 $_[3] tem valor 7 $_[4] tem valor 9 PASSANDO ARGUMENTOS @_ e referências $seq = restricao("ecori", "HaeIII", "HindIII"); Argumentos em @_: $_[0] tem valor EcoRI $_[1] tem valor HaeIII $_[2] tem valor HindIII 21
PASSANDO ARGUMENTOS @_ e referências @nome = ("EcoRI", "HaeIII", "HindIII"); @sitio = ("GAATTC", "GGCC", "AAGCTT"); $sequencia = restricao(@nome, @sitio); PASSANDO ARGUMENTOS @_ e referências @nome = ("EcoRI", "HaeIII", "HindIII"); @sitio = ("GAATTC", "GGCC", "AAGCTT"); $sequencia = restricao(@nome, @sitio); Argumentos em @_: $_[0] tem valor EcoRI $_[1] tem valor HaeIII $_[2] tem valor HindIII $_[3] tem valor GAATTC $_[4] tem valor GGCC $_[5] tem valor AAGCTT 22
PASSANDO ARGUMENTOS exemplo07 (solução 1): @_ e referências ## MAIN ## $sequencia = restricao($#nome, @nome, $#sitio, @sitio); ## ## sub restricao { my @nome; my @sitio; my $lastindex = shift; for (my $i = 0; $i <= $lastindex; $i++) { $nome[$i] = shift; $lastindex = shift; for (my $i = 0; $i <= $lastindex; $i++) { $sitio[$i] = shift; # bloco de comandos para usar os arrays PASSANDO ARGUMENTOS @_ e referências exemplo08 (solução 2, passando referencias): ## MAIN ## $sequencia = restricao(\@nome, \@sitio); ## ## sub restricao { my ($ref1, $ref2) = @_; my @a1 = @{$ref1; my @a2 = @{$ref2; # bloco de comandos para usar os arrays print "@nome\n"; print "@sitio\n"; 23
PASSANDO ARGUMENTOS REFERÊNCIAS Passando referência de arrays: subrotina(\@arr); Usando arrays: sub subrotina { my ($arrref) = @_; my @array = @{$arrref; #... Passando referência de hash: subrotina(\%hash); Usando hashes: sub subrotina { my ($hashref) = @_; my %hash = %{$hashref; #... RETORNANDO VARIÁVEIS REFERÊNCIAS Retornando referência de arrays: sub listatel { my @tel; $info[0] = <STDIN>; #nome $info[1]= <STDIN>; #tel return \@info; Retornando referência de hashes: sub listatel { my %info; $info{"nome" = <STDIN>; $info{"tel" = <STDIN>; return \%info; Recuperando arrays no script: my $telref = listatel(); my @tel = @{$telref; Recuperando hashes no script: my $telref = listatel(); my %tel = %{$telref; 24
MÓDULOS Conjunto de subrotinas comseqaleatoria.pl MÓDULOS Conjunto de subrotinas aula08.pm ## Modulo com as minhas subrotinas ## Script para exemplificar subrotinas use strict; use aula08; ## Declaracao de variaveis my $tamanho; my $sequencia; my $revseq; # criar a sequencia aleatoria $tamanho = 200; $sequencia = seqaleatoria($tamanho); # inverter a sequencia $revseq = reverse($sequencia); # gerar o complemento reverso $revseq =~ tr/atcg/atcg/; # imprimir (fasta) print "\>seq\n"; for (my $i = 0; $i < $tamanho; $i+=70) { print substr($revseq,$i,70), "\n"; ## modulo aula08 sub seqaleatoria { sub seqaleatoria { $seq = ""; $tamanho $seq = ""; = shift 40; for $tamanho ($i = = 0; shift $i < $tamanho; 40; $i++) { for ($i $base = 0; = int(rand(4)); $i < $tamanho; $i++) { if $base ($base = int(rand(4)); == 0) { $seq.= "A"; next; if ($base == 1) 0) { $seq.= "T"; "A"; next; if ($base == 2) 1) { $seq.= "C"; "T"; next; if ($base == 3) 2) { $seq.= "G"; "C"; next; if ($base == 3) { $seq.= "G"; next; return $seq; return $seq; sub soma { ($n1, $n2) = @_; $valor = $n1 + $n2; return $valor; 1; 25
comseqaleatoria.pl MÓDULOS Conjunto de subrotinas aula08.pm ## Modulo com as minhas subrotinas ## Script para exemplificar subrotinas use strict; use aula08; ## Declaracao de variaveis my $tamanho; my $sequencia; my $revseq; # criar a sequencia aleatoria $tamanho = 200; $sequencia = seqaleatoria($tamanho); # inverter a sequencia $revseq = reverse($sequencia); # gerar o complemento reverso $revseq =~ tr/atcg/atcg/; # imprimir (fasta) print "\>seq\n"; for (my $i = 0; $i < $tamanho; $i+=70) { print substr($revseq,$i,70), "\n"; ## modulo aula08 sub seqaleatoria { sub seqaleatoria { $seq = ""; $tamanho $seq = ""; = shift 40; for $tamanho ($i = = 0; shift $i < $tamanho; 40; $i++) { for ($i $base = 0; = int(rand(4)); $i < $tamanho; $i++) { if $base ($base = int(rand(4)); == 0) { $seq.= "A"; next; if ($base == 1) 0) { $seq.= "T"; "A"; next; if ($base == 2) 1) { $seq.= "C"; "T"; next; if ($base == 3) 2) { $seq.= "G"; "C"; next; if ($base == 3) { $seq.= "G"; next; return $seq; return $seq; sub soma { ($n1, $n2) = @_; $valor = $n1 + $n2; return $valor; 1; MÓDULOS Conjunto de subrotinas No terminal Darwin:Aula08 Tatiana$ perl seqaleatoria.pl Can't locate aula08.pm in @INC (@INC contains: /Library/ Perl/5.12/darwin-thread-multi-2level /Library/Perl/5.12 / Network/Library/Perl/5.12/darwin-thread-multi-2level / Network/Library/Perl/5.12 /Library/Perl/Updates/5.12.4 / System/Library/Perl/5.12/darwin-thread-multi-2level / System/Library/Perl/5.12 /System/Library/Perl/Extras/ 5.12/darwin-thread-multi-2level /System/Library/Perl/ Extras/5.12.) at seqaleatoria.pl line 16. BEGIN failed--compilation aborted at seqaleatoria.pl line 16. Darwin:Aula08 Tatiana$! 26
MÓDULOS Conjunto de subrotinas No terminal Darwin:Aula08 Tatiana$ perl seqaleatoria.pl Can't locate aula08.pm in @INC (@INC contains: /Library/ Perl/5.12/darwin-thread-multi-2level /Library/Perl/5.12 / Network/Library/Perl/5.12/darwin-thread-multi-2level / Network/Library/Perl/5.12 /Library/Perl/Updates/5.12.4 / System/Library/Perl/5.12/darwin-thread-multi-2level / System/Library/Perl/5.12 /System/Library/Perl/Extras/ 5.12/darwin-thread-multi-2level /System/Library/Perl/ Extras/5.12.) at seqaleatoria.pl line 16. BEGIN failed--compilation aborted at seqaleatoria.pl line 16. Darwin:Aula08 Tatiana$! No terminal MÓDULOS Conjunto de subrotinas Darwin:Aula08 Tatiana$ perl -V ###varias linhas### @INC: /Library/Perl/5.12/darwin-thread-multi-2level /Library/Perl/5.12 /Network/Library/Perl/5.12/darwin-thread-multi-2level /Network/Library/Perl/5.12 /Library/Perl/Updates/5.12.4 /System/Library/Perl/5.12/darwin-thread-multi-2level /System/Library/Perl/5.12 /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level /System/Library/Perl/Extras/5.12. Darwin:Aula08 Tatiana$! 27
comseqaleatoria.pl MÓDULOS Conjunto de subrotinas aula08.pm ## Modulo com as minhas subrotinas ## Script para exemplificar subrotinas use lib '/Users/Tatiana/eclipse/modulos/'; use strict; use aula08; ## Declaracao de variaveis my $tamanho; my $sequencia; my $revseq; # criar a sequencia aleatoria $tamanho = 200; $sequencia = seqaleatoria($tamanho); # inverter a sequencia $revseq = reverse($sequencia); # gerar o complemento reverso $revseq =~ tr/atcg/atcg/; # imprimir (fasta) print "\>seq\n"; for (my $i = 0; $i < $tamanho; $i+=70) { print substr($revseq,$i,70), "\n"; ## modulo aula08 sub seqaleatoria { sub seqaleatoria { $seq = ""; $tamanho $seq = ""; = shift 40; for $tamanho ($i = = 0; shift $i < $tamanho; 40; $i++) { for ($i $base = 0; = int(rand(4)); $i < $tamanho; $i++) { if $base ($base = int(rand(4)); == 0) { $seq.= "A"; next; if ($base == 1) 0) { $seq.= "T"; "A"; next; if ($base == 2) 1) { $seq.= "C"; "T"; next; if ($base == 3) 2) { $seq.= "G"; "C"; next; if ($base == 3) { $seq.= "G"; next; return $seq; return $seq; sub soma { ($n1, $n2) = @_; $valor = $n1 + $n2; return $valor; 1; Alguns truques 1. No Eclipse, New > New Perl File; testemodulo.pl 2. No Eclipse, New > New Perl File; aula08.pm 3. Alterar o exemplo06 para que as subro@nas sejam transferidas para o modulo aula08.pm 28
comseqaleatoria.pl MÓDULOS Conjunto de subrotinas aula08.pm ## Modulo com as minhas subrotinas ## Script para exemplificar subrotinas use lib qw(/users/tatiana/eclipse/aula08/); use strict; use aula08; ## Declaracao de variaveis my $tamanho; my $sequencia; my $revseq; # criar a sequencia aleatoria $tamanho = 200; $sequencia = seqaleatoria($tamanho); # inverter a sequencia $revseq = reverse($sequencia); # gerar o complemento reverso $revseq =~ tr/atcg/atcg/; # imprimir (fasta) print "\>seq\n"; for (my $i = 0; $i < $tamanho; $i+=70) { print substr($revseq,$i,70), "\n"; ## modulo aula08 sub seqaleatoria { sub seqaleatoria { $seq = ""; $tamanho $seq = ""; = shift 40; for $tamanho ($i = = 0; shift $i < $tamanho; 40; $i++) { for ($i $base = 0; = int(rand(4)); $i < $tamanho; $i++) { if $base ($base = int(rand(4)); == 0) { $seq.= "A"; next; if ($base == 1) 0) { $seq.= "T"; "A"; next; if ($base == 2) 1) { $seq.= "C"; "T"; next; if ($base == 3) 2) { $seq.= "G"; "C"; next; if ($base == 3) { $seq.= "G"; next; return $seq; return $seq; sub soma { ($n1, $n2) = @_; $valor = $n1 + $n2; return $valor; 1; EXERCÍCIOS 1 Fazer uma subro@na para ler arquivos no formato FASTA e uma segunda subro@na para imprimir as sequências também no formato FASTA, mas com o número de caracteres por linha indicado pelo usuário. 2A. Usando o arquivo de saida do blast da aula passada (chom_out_blast_res.txt), fazer um script que imprima os Hits que apresentem Evalue menor que 1e05. Nao imprima somente o BestHit. Use uma subro@na para verificar se o Evalue é menor que 1e05.2. 2B. Mude o script para que o valor limite (máximo) do Evalue a ser selecionado seja passado por parâmetro na chamada do programa. A subro@na deverá retornar a linha com o Hit que foi selecionado. Imprima o Hit fora da subro@na. 3. Combinando 1 e 2. Ler a saída do BLAST e o arquivo de sequências; gerar a tabela com os hits abaixo do Evalue desejado e produzir uma saída com as sequências das queries selecionadas. 29
(0,5 P2) Fazer um SCRIPT para: DESAFIO ENTREGA ATÉ 17/11 (VIA E-MAIL) 1. Ler sequências (e qualidades) no formato FASTA e armazenar em dois hashes: %seq e %qual (subro@na numero 1) 2. Buscar UM sí@o de enzima de restrição indicado pelo usuário em todas as sequências (subro@na numero 2). Armazenar o nome das sequências que possuem o si@o de reconhecimento e sua posição na sequências. 3. Para as sequências COM o sí@o indicado, converter sequências e qualidades no formato FASTA (amazenadas nos hashs %seq e %qual) para formato FASTQ (subro@na numero 3). Gerar um novo arquivo de saída, indicando a posição do sí@o na DESCRIÇÃO da sequencia. Ver descrição de FASTQ e tabela de conversão no WIKIPEDIA. ENTRADA: arquivosequencias.fasta e arquivoqualidades.fasta SAIDA: arquivosequenciascomsi@o.fastq Testem antes de enviar! 30