quarta-feira, 14 de março de 2012

Get multiples sequence of Genbank


Neste caso em particular, eu precisava obter uma lista de 150 genes de determinados organismos, usando Bioperl.  

Contando com a super ajuda do Rondon (de novo!)


#!/usr/bin/perl

use warnings;
use strict;
use Bio::SeqIO;
use Bio::DB::GenBank;
use Bio::DB::Query::GenBank;

my @genes = ("ARP3[TITL]", "PAB1[TITL]", "CAR2[TITL]", "SEC24[TITL]", "PRE9[TITL]", "GLC7[TITL]", "BIM1[TITL]", "BET2[TITL]", "ESA1[TITL]", "YSH1[TITL]", "CBR1[TITL]", "RFC4[TITL]", "TOP2[TITL]", "RSP5[TITL]", "BRR2[TITL]", "KIP3[TITL]", "YTA12[TITL]", "HOS2[TITL]", "YAK1[TITL]", "KIC1[TITL]", "YDJ1[TITL]", "TAF5[TITL]", "ROT2[TITL]", "RPN9[TITL]", "SAC1[TITL]", "SUL2[TITL]", "ADK1[TITL]", "BET3[TITL]", "KGD2[TITL]", "PSR1[TITL]", "SUI2[TITL]", "LSC2[TITL]", "MYO2[TITL]", "URA2[TITL]", "ALD5[TITL]", "HAS1[TITL]", "TOP1[TITL]", "SMC4[TITL]", "SER1[TITL]", "SUP35[TITL]", "SSC1[TITL]", "PHB1[TITL]", "FAL1[TITL]", "RFC2[TITL]", "CDC9[TITL]", "ILS1[TITL]", "CCC2[TITL]", "TCP1[TITL]", "PUF3[TITL]", "CRM1[TITL]", "UBA3[TITL]", "SKY1[TITL]", "CDC2[TITL]", "PUP1[TITL]", "MLH1[TITL]", "RPT1[TITL]", "URA6[TITL]", "CDC48[TITL]", "APL4[TITL]", "CLB2[TITL]", "ILV1[TITL]", "MET14[TITL]", "SOD2[TITL]", "RRM3[TITL]", "PIM1[TITL]", "TRM1[TITL]", "IMP4[TITL]", "PRO3[TITL]", "HHT2[TITL]", "YPK1[TITL]", "ALA1[TITL]", "PRP22[TITL]", "GRX4[TITL]", "SEC7[TITL]", "KAR3[TITL]", "CDC39[TITL]", "RSA4[TITL]", "VMA2[TITL]", "MTO1[TITL]", "KRE33[TITL]", "LYS12[TITL]", "VPS60[TITL]", "VAS1[TITL]", "FAA2[TITL]", "FUS3[TITL]", "VAC14[TITL]", "PRX1[TITL]", "NUG1[TITL]", "UTP15[TITL]", "YPT1[TITL]", "CDC47[TITL]", "PDI1[TITL]", "URK1[TITL]", "GLR1[TITL]", "TIM50[TITL]", "KIN28[TITL]", "VMA6[TITL]", "PRP46[TITL]", "PRC1[TITL]", "SSB2[TITL]", "SPT15[TITL]", "PGK1[TITL]", "SMC2[TITL]", "BMS1[TITL]", "TEF1[TITL]", "HMT1[TITL]", "SEC23[TITL]", "SUI3[TITL]", "COP1[TITL]", "RAD54[TITL]", "MCM2[TITL]", "AMD1[TITL]", "SEC26[TITL]", "FAA1[TITL]", "VMA5[TITL]", "VPH1[TITL]", "ADE12[TITL]", "CBK1[TITL]", "MSF1[TITL]", "ENO1[TITL]", "PDB1[TITL]", "BMH2[TITL]", "MIS1[TITL]", "ERG10[TITL]", "ARF2[TITL]", "NBP35[TITL]", "SEC17[TITL]", "LCB2[TITL]", "KRR1[TITL]", "ACT1[TITL]", "RPS3[TITL]", "SEC21[TITL]", "MAP1[TITL]", "CDC19[TITL]", "STT3[TITL]", "ATM1[TITL]", "RIP1[TITL]", "PWP2[TITL]", "HAT2[TITL]", "SER33[TITL]", "CCT5[TITL]", "PYC1[TITL]", "FBP26[TITL]", "TDH3[TITL]", "RET1[TITL]", "MTR4[TITL]", "MEF1[TITL]", "GLE2[TITL]", "DBP2[TITL]", "NMT1[TITL]");

my @organisms = ("Saccharomyces cerevisiae S288c [ORGN]");

foreach my $orgn_query (@organisms){
  my $seq_out = Bio::SeqIO -> new  (-format => 'fasta',
   -file => ">$orgn_query.fasta");
  foreach my $nucleotide (@genes){
    my $db_obj = Bio::DB::GenBank->new;
    my $query_obj = Bio::DB::Query::GenBank->new( -db    => 'nucleotide',
 -query => "$orgn_query AND $nucleotide" );
    my $gb_obj = Bio::DB::GenBank->new;
    my $stream_obj = $gb_obj->get_Stream_by_query($query_obj);
while (my $seq_obj = $stream_obj->next_seq) {
 $seq_out -> write_seq($seq_obj);
}
    }
}
exit;

segunda-feira, 27 de fevereiro de 2012

Um guia compreensivo dos grandes genomas de animais: o que sabemos e para onde estamos indo.


Resumo: O estudo da diversidade de tamanhos de genomas é um campo cada vez maior e altamente relevante no atual cenário do sequenciamento de DNA, cada vez mais rápido e eficiente. Os tamanhos de genomas animais variam de 0,02 a 132,83 pg (1pg = 978Mb) mas a maioria dos genomas animais são pequenos, com tamanho máximo inferior a 5 pg. Animais com grandes genomas (>10 pg) estão espalhados entre os invertebrados (incluindo os Platelmintos, Crustáceos e Orthoptera) e também entre os vertebrados (incluindo os Actinopterygii, Chondrichthyes e alguns anfíbios). Neste artigo, vamos explorar as conexões entre tamanho do genoma com fenótipo, fisiologia e ecologia destes organismos. Discutimos também, alguns dos mecanismos moleculares de redução e expansão do genoma obtido através de estudos comparativos entre espécies com sequências genômicas completas e como isso pode se aplicar às espécies com grande genomas. Como a maioria dos genomas das espécies animais sequenciados até o momento são genomas pequenos (especialmente invertebrados), devido aos custos de sequenciamento e das dificuldades associada com montagens de genoma de grandes dimensões, uma compreensão da composição estrutural deste grandes genomas é necessária. Estudos utilizando sequenciamento de nova geração (NGS) estão sendo utilizados pela primeira vez em animais com grandes genomas. Tais análises usando baixa cobertura genômica estão oferecendo uma visão da composição de elementos repetitivos em animais com genomas mais complexos. Estudos futuros permitirão uma melhor compreensão dos fatores que levam à obesidade genômica em animais.

France Dufresne & Nicholas Jeffer


sábado, 18 de fevereiro de 2012

Além do Ateu e do Ateísmo

Somos todos ateus perante o deus do outro.

"O Homem é quem faz a religião, e não a religião que faz o Homem. A religião é auto consciência e sentimento do Homem. O Homem é o mundo do homem, o estado e a sociedade. O estado e a sociedade inventam a religião."
Carl Max




quarta-feira, 15 de fevereiro de 2012

Curiosidades do Universo com Stephen Hawking.


Deus criou o Universo? A ciência te oferece uma outra explicação. E acredite, você será capaz de entender! Aprendamos um pouco com o Prof. Stephen Hawking.




terça-feira, 14 de fevereiro de 2012

Script Codon Usage


Esse script carrega em um hash a tabela de codon usage (reference) de 6.222 ORF's de leveduras, depois conta a frequência de códons de um arquivo de genes (query) e compara a frequência de códons da query x reference.

Versão beta (com super auxílio do Rondon)


#!/usr/bin/perl
use strict;
use warnings;
use Bio::SeqIO;
# use diagnostics;

die "\nUSAGE::: perl $0 [query.fasta] [reference.fasta(optional)]\n\n" if !$ARGV[0];

#gera tabela de codon usage para a query
my $query_file = $ARGV[0];
my %aux_query1= %{usage ($query_file)};

open(FILE, 'table_yeast_usage_parsed.txt') or die;

my %table_usage;

foreach my $line (<FILE>){
    chomp $line;
    if    ( $line =~ /^Codon/ ) { next }
    elsif ( $line !~ /\w/   ) { next }
    my ($codon,$aa,$contagem,$fraction) = split ('\t', $line);
#     print "$fraction'\n";
    $table_usage{$codon}{aa}=$aa;
    $table_usage{$codon}{contagem}=$contagem;
    $table_usage{$codon}{fraction}=$fraction;
}

# my $contagem_total = %{%usage_reference};

my $ref = contagem_aa_totais( \%aux_query1 );
my %hash = %{$ref};

my $ref2 = gera_valor_normalizado_reference(\%hash);
my %fraction_query = %{$ref2};

foreach my $key(sort {$fraction_query{$a}{aa} cmp $fraction_query{$b}{aa}} keys %fraction_query){ #acessar os valores dentro do hash
     print "$key\t$fraction_query{$key}{aa}\t$fraction_query{$key}{normalizado}\t$table_usage{$key}{fraction}\n";
  }

close FILE;

exit;

sub contagem_aa_totais {
#Faz a contagem total das aparicoes dos aa pra normalizar os valores. Pega o hash de dados da Referencia e insere os resultados na mesma tabela.

        my $ref = shift;
        my %usage_reference = %{$ref};

        #Gera array com os aa usados
        my @aa;
        while (my ($codon, $ref) = each %usage_reference) {
                my %valores = %{$ref};
                foreach my $key (keys %valores){
                        if ($key eq "aa") { push @aa, $valores{$key} }
                }
        }

        #soma o total de cada aa
        foreach my $a (@aa) {
                my $sum = 0;
                #soma cada aa
                foreach my $codon (keys %usage_reference){
                        if ( $a eq $usage_reference{$codon}{aa} ) { $sum += $usage_reference{$codon}{contagem} }
                }
                #insere o valor no hash
                foreach my $codon (keys %usage_reference){
                        if ( $a eq $usage_reference{$codon}{aa} ) { $usage_reference{$codon}{aa_totais} = $sum }
                }
        }
        return \%usage_reference;
}

sub gera_valor_normalizado_reference {

        my $ref = shift;
my %usage_reference = %{$ref};

        foreach my $codon (keys %usage_reference) {
                $usage_reference{$codon}{normalizado} = $usage_reference{$codon}{contagem} / $usage_reference{$codon}{aa_totais};
        }
        return \%usage_reference;
}

sub conta_codons {
# conta os codons de um arquivo fasta
        my $file_name = shift;

        my $file_obj = Bio::SeqIO -> new ( -file => $file_name,
                                           -format => 'fasta'   );

        #gera hash com a quantidade de vezes que cada codon aparece.
        my %codons;
        while (my $inseq = $file_obj->next_seq) {
                        # grava cada seq na variavel $sequence
                my $sequence = $inseq->seq();
                #anda de 3 em 3 (tem q ver se da certo)
                for(my $i=0; $i < (length($sequence) - 2) ; $i += 3){
                my $codon = substr($sequence,$i,3);
                #se o codon for novo na tabela, ele recebe o valor 1
                        if (!defined $codons{$codon}) { $codons{$codon} = 1 }
                        # se ele for recorrente, apenas soma 1.
                        else { $codons{$codon}++; }
                }
        }
        return \%codons;
}

sub gera_valor_normalizado_query {
#insere na tabela da query, qual e a freq normalizada (em %) de cada codon
# essa subrotina recebe dois valores: has_query e hash_referencia

        my $ref_query = shift;
        my %usage_query = %{$ref_query};

my $ref_reference = shift;
  my %usage_reference = %{$ref_reference};

        foreach my $codon (keys %usage_query) {
                $usage_query{$codon}{freq_codon_normalizada} = $usage_reference{$codon}{normalizado};
        }
        return \%usage_query;
}

sub table_aa {
#Verifica e salva quais sao os aa dos codons e suas freq
        my $ref = shift;
        my %codons = %{$ref};

        my %usage;
        foreach my $codon (keys %codons) {

        if ( $codon =~ /GC./i)        { $usage{$codon}{aa}= "ala"; $usage{$codon}{contagem}= $codons{$codon}; }    # Alanine
     elsif ( $codon =~ /TG[TC]/i)     { $usage{$codon}{aa}= "cys"; $usage{$codon}{contagem}= $codons{$codon}; }    # Cysteine
     elsif ( $codon =~ /GA[TC]/i)     { $usage{$codon}{aa}= "aca"; $usage{$codon}{contagem}= $codons{$codon}; }    # Aspartic Acid
     elsif ( $codon =~ /GA[AG]/i)     { $usage{$codon}{aa}= "glu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glutamic Acid
     elsif ( $codon =~ /TT[TC]/i)     { $usage{$codon}{aa}= "phe"; $usage{$codon}{contagem}= $codons{$codon}; }    # Phenylalanine
     elsif ( $codon =~ /GG./i)        { $usage{$codon}{aa}= "gly"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glycine
     elsif ( $codon =~ /CA[TC]/i)     { $usage{$codon}{aa}= "his"; $usage{$codon}{contagem}= $codons{$codon}; }    # Histidine
     elsif ( $codon =~ /AT[TCA]/i)    { $usage{$codon}{aa}= "iso"; $usage{$codon}{contagem}= $codons{$codon}; }    # Isoleucine
     elsif ( $codon =~ /AA[AG]/i)     { $usage{$codon}{aa}= "lys"; $usage{$codon}{contagem}= $codons{$codon}; }    # Lysine
     elsif ( $codon =~ /TT[AG]|CT./i) { $usage{$codon}{aa}= "leu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Leucine
     elsif ( $codon =~ /ATG/i)        { $usage{$codon}{aa}= "met"; $usage{$codon}{contagem}= $codons{$codon}; }    # Methionine
     elsif ( $codon =~ /AA[TC]/i)     { $usage{$codon}{aa}= "asp"; $usage{$codon}{contagem}= $codons{$codon}; }    # Asparagine
     elsif ( $codon =~ /CC./i)        { $usage{$codon}{aa}= "pro"; $usage{$codon}{contagem}= $codons{$codon}; }    # Proline
     elsif ( $codon =~ /CA[AG]/i)     { $usage{$codon}{aa}= "glu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glutamine
     elsif ( $codon =~ /CG.|AG[AG]/i) { $usage{$codon}{aa}= "arg"; $usage{$codon}{contagem}= $codons{$codon}; }    # Arginine
     elsif ( $codon =~ /TC.|AG[TC]/i) { $usage{$codon}{aa}= "ser"; $usage{$codon}{contagem}= $codons{$codon}; }    # Serine
     elsif ( $codon =~ /AC./i)        { $usage{$codon}{aa}= "thr"; $usage{$codon}{contagem}= $codons{$codon}; }    # Threonine
     elsif ( $codon =~ /GT./i)        { $usage{$codon}{aa}= "val"; $usage{$codon}{contagem}= $codons{$codon}; }    # Valine
     elsif ( $codon =~ /TGG/i)        { $usage{$codon}{aa}= "try"; $usage{$codon}{contagem}= $codons{$codon}; }    # Tryptophan
     elsif ( $codon =~ /TA[TC]/i)     { $usage{$codon}{aa}= "tyr"; $usage{$codon}{contagem}= $codons{$codon}; }    # Tyrosine
     elsif ( $codon =~ /TA[AG]|TGA/i) { $usage{$codon}{aa}= "stp"; $usage{$codon}{contagem}= $codons{$codon}; }    # Stop
     else { $usage{$codon}{aa}= "err"; $usage{$codon}{contagem}= $codons{$codon}; } # base diferente
     }

     return \%usage;
}

sub usage {
#conta codons num arquivo fasta ou multifasta e gera tabela com codon, aa e freq e outros dados
my $query_file = shift;

#fre de codons
my %codons = %{conta_codons($query_file)};

#associa a contagem dos codons com os aminoacidos
my %usage = %{table_aa(\%codons)};

return \%usage;
}

quarta-feira, 8 de fevereiro de 2012

quinta-feira, 2 de fevereiro de 2012

O passado é uma possibilidade

Se podemos apenas saber que uma partícula viajou de um ponto A a um ponto B, mas não observamos o caminho que ela fez para chegar ao seu destino, é possível concluir que ela, simultaneamente, fez todos os trajetos possíveis para construir a trajetória. Esse é um princípio da mecânica quântica, que explica: se qualquer evento no passado não foi observado e registrado, ele é tão indefinido quanto um evento futuro. Dessa forma, não se pode dizer que ele aconteceu de determinada maneira, e sim de todas as maneiras possíveis ao mesmo tempo. Loucura, totalmente plausível do Stephen Hawking não?

Contagem de códons em um genoma, usando Perl.


Carreguei um arquivo multifasta de genes, contei as trincas de códons, e joguei num hash com os códons, aminoácidos e frequência de cada códon.


#!/usr/bin/perl
use Bio::SeqIO;
use strict;
use warnings;

my $ref1 = conta_codons("genes_yeast.ffn");
my %codons = %{$ref1};

my $ref2 = table_aa(\%codons);
my %usage = %{$ref2};

my $last="a";

foreach my $codon (sort {$usage{$a}{name} cmp $usage{$b}{name}} keys %usage) {
if ($last eq $usage{$codon}{name}){ print "$codon\t$usage{$codon}{name}\t$usage{$codon}{contagem}\n";}
else { print "\n$codon\t$usage{$codon}{name}\t$usage{$codon}{contagem}\n"; }
$last = $usage{$codon}{name};
}

exit;

sub conta_codons {

my $file_name = shift;

        my $file_obj = Bio::SeqIO -> new ( -file => $file_name,
                                           -format => 'fasta'   );

        #gera hash com a quantidade de vezes que cada codon aparece.
        my %codons;
        while (my $inseq = $file_obj->next_seq) {
                        # grava cada seq na variavel $sequence
                my $sequence = $inseq->seq();
                #anda de 3 em 3 (tem q ver se da certo)
                for(my $i=0; $i < (length($sequence) - 2) ; $i += 3){
                my $codon = substr($sequence,$i,3);
                #se o codon for novo na tabela, ele recebe o valor 1
                        if (!defined $codons{$codon}) { $codons{$codon} = 1 }
                        # se ele for recorrente, apenas soma 1.
                        else { $codons{$codon}++; }
                }
        }
return \%codons;
}


sub table_aa {
     
my $ref = shift;
my %codons = %{$ref};

my %usage;
foreach my $codon (keys %codons) {

        if ( $codon =~ /GC./i)        { $usage{$codon}{name}= "ala"; $usage{$codon}{contagem}= $codons{$codon}; }    # Alanine
     elsif ( $codon =~ /TG[TC]/i)     { $usage{$codon}{name}= "cys"; $usage{$codon}{contagem}= $codons{$codon}; }    # Cysteine
     elsif ( $codon =~ /GA[TC]/i)     { $usage{$codon}{name}= "aca"; $usage{$codon}{contagem}= $codons{$codon}; }    # Aspartic Acid
     elsif ( $codon =~ /GA[AG]/i)     { $usage{$codon}{name}= "glu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glutamic Acid
     elsif ( $codon =~ /TT[TC]/i)     { $usage{$codon}{name}= "phe"; $usage{$codon}{contagem}= $codons{$codon}; }    # Phenylalanine
     elsif ( $codon =~ /GG./i)        { $usage{$codon}{name}= "gly"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glycine
     elsif ( $codon =~ /CA[TC]/i)     { $usage{$codon}{name}= "his"; $usage{$codon}{contagem}= $codons{$codon}; }    # Histidine
     elsif ( $codon =~ /AT[TCA]/i)    { $usage{$codon}{name}= "iso"; $usage{$codon}{contagem}= $codons{$codon}; }    # Isoleucine
     elsif ( $codon =~ /AA[AG]/i)     { $usage{$codon}{name}= "lys"; $usage{$codon}{contagem}= $codons{$codon}; }    # Lysine
     elsif ( $codon =~ /TT[AG]|CT./i) { $usage{$codon}{name}= "leu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Leucine
     elsif ( $codon =~ /ATG/i)        { $usage{$codon}{name}= "met"; $usage{$codon}{contagem}= $codons{$codon}; }    # Methionine
     elsif ( $codon =~ /AA[TC]/i)     { $usage{$codon}{name}= "asp"; $usage{$codon}{contagem}= $codons{$codon}; }    # Asparagine
     elsif ( $codon =~ /CC./i)        { $usage{$codon}{name}= "pro"; $usage{$codon}{contagem}= $codons{$codon}; }    # Proline
     elsif ( $codon =~ /CA[AG]/i)     { $usage{$codon}{name}= "glu"; $usage{$codon}{contagem}= $codons{$codon}; }    # Glutamine
     elsif ( $codon =~ /CG.|AG[AG]/i) { $usage{$codon}{name}= "arg"; $usage{$codon}{contagem}= $codons{$codon}; }    # Arginine
     elsif ( $codon =~ /TC.|AG[TC]/i) { $usage{$codon}{name}= "ser"; $usage{$codon}{contagem}= $codons{$codon}; }    # Serine
     elsif ( $codon =~ /AC./i)        { $usage{$codon}{name}= "thr"; $usage{$codon}{contagem}= $codons{$codon}; }    # Threonine
     elsif ( $codon =~ /GT./i)        { $usage{$codon}{name}= "val"; $usage{$codon}{contagem}= $codons{$codon}; }    # Valine
     elsif ( $codon =~ /TGG/i)        { $usage{$codon}{name}= "try"; $usage{$codon}{contagem}= $codons{$codon}; }    # Tryptophan
     elsif ( $codon =~ /TA[TC]/i)     { $usage{$codon}{name}= "tyr"; $usage{$codon}{contagem}= $codons{$codon}; }    # Tyrosine
     elsif ( $codon =~ /TA[AG]|TGA/i) { $usage{$codon}{name}= "stp"; $usage{$codon}{contagem}= $codons{$codon}; }    # Stop
     else { print STDERR "Bad codon \"$codon\"!!\n" }
     }

     return \%usage;
 }

terça-feira, 31 de janeiro de 2012

Imagine, junto com John Lennon 

"Imagine o mundo sem ataques suicidas, sem o 11/9, sem o 7/7 londrino, sem as Cruzadas, sem caça às bruxas, sem a Conspiração da Pólvora, sem a partição da Índia, sem as guerras entre israelenses e palestinos, sem massacres sérvios/croatas/muçulmanos, sem a perseguição de judeus como "assassinos de Cristo", sem os "problemas" da Irlanda do Norte, sem "assassinatos em nome da honra", sem evangélicos televisivos de terno brilhante e cabelo bufante tirando dinheiro dos ingênuos. Imagine o mundo sem o Talibã para explodir estátuas antigas, sem decapitações públicas de blasfemos, sem o açoite da pele feminina pelo crime de ter se mostrado em um centímetro."
Richard Dawkins. Deus, um Delírio. página 24. 
Salvar um nome para um ip e conectar via ssh sem senha (via Cacique Raony)


Primeiro vamos editar e salvar o arquivo de hosts em /etc  (na sua máquina), adicionando os ips seguidos dos nomes dos servidores:

$ vi /etc/hosts


150.164.37.241 chaves
150.164.37.168 kiko

Ao conectar use o nome ao invés do ip, ex:

$ ssh -X thiagomafra@kiko

Agora, para conectar sem ter que digitar a senha:


No seu computador:


$ ssh-keygen -t rsa
$ scp ~/.ssh/id_rsa.pub user@example.com:~/
$ ssh user@host


No computador de destino:


$ mkdir .ssh
$ cat id_rsa.pub >> .ssh/authorized_keys
$ rm id_rsa.pub

$ chmod go -w ~
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssg/authorized_keys




Ou então, mais fácil ainda:

$ ssh-copy-id user@host

segunda-feira, 30 de janeiro de 2012

Python e Bioinformática

Bioinformatics Programming Using Python!





"It is undeniable that Python is catching up, although some areas seem to be still much more better served by Perl. As a Python fan now learning Perl, what I see may decide what language will be more popular in the future is going to be played between Perl's broader base of code versus Python's more readable and 'logical' (to my mind at least) code. I'll bet on Python becoming more popular just because, having learned it, you can really express yourself naturally without straining your mind and I believe that this is going to be more important for that class of people described as 'non-typical programmers', among which science students and researchers belong most of the time, having had no formal and solid programming teaching."

quarta-feira, 18 de janeiro de 2012

Carregar e ordenar uma matriz em Perl

Estava precisando carregar uma matriz 15x10 e ordenar os números desta matriz em ordem crescente.


#!/usr/bin/perl


use strict;
use warnings;


open INFILE, '<matriz.txt' or die $!;


  my @matriz=<INFILE>;
  close INFILE;
    print " Matriz desordenada \n\n @matriz\n\n";
      print " Matriz ordenada \n\n";
#ordenar a matriz
      foreach my $linha (@matriz){
 chomp $linha;
 my @numeros =  split " ", $linha;
 my @matriz_ordenada = sort @numeros;
 foreach my $numeros_ordenados (@matriz_ordenada) {
     print " $numeros_ordenados "
    }
print "\n";
}
exit;  


Output do script abaixo:

Matriz desordenada

 03 16 15 11 10 06 21 08 14 01 09 24 19 18 20
 24 22 13 03 05 21 17 18 19 20 04 11 02 25 14
 05 20 15 04 09 07 22 13 24 16 11 21 01 10 14
 03 07 24 19 08 01 11 23 22 14 16 15 02 25 18
 04 06 12 22 07 21 20 09 15 03 14 24 10 18 02
 22 18 03 08 04 21 19 06 02 25 23 10 09 16 15
 10 21 25 01 22 18 13 02 16 06 07 14 08 19 09
 17 04 20 21 16 10 19 13 12 03 22 23 25 14 08
 04 14 25 08 23 05 13 03 01 10 02 07 20 06 09
 08 24 15 23 02 18 11 21 25 20 17 14 22 05 10
 15 17 08 16 11 24 14 22 05 23 02 13 06 03 10

 Matriz ordenada

01 03 06 08 09 10 11 14 15 16 18 19 20 21 24
02 03 04 05 11 13 14 17 18 19 20 21 22 24 25
01 04 05 07 09 10 11 13 14 15 16 20 21 22 24
01 02 03 07 08 11 14 15 16 18 19 22 23 24 25
02 03 04 06 07 09 10 12 14 15 18 20 21 22 24
02 03 04 06 08 09 10 15 16 18 19 21 22 23 25
01 02 06 07 08 09 10 13 14 16 18 19 21 22 25
03 04 08 10 12 13 14 16 17 19 20 21 22 23 25
01 02 03 04 05 06 07 08 09 10 13 14 20 23 25
02 05 08 10 11 14 15 17 18 20 21 22 23 24 25
02 03 05 06 08 10 11 13 14 15 16 17 22 23 24