2016-05-04 9 views
6

Buon pomeriggio, sto cercando di contare il numero di volte che le lettere A C T G si verificano nella sequenza del DNA usando perl6.i ho provato altri modi sono solo cercando di farlo in un altro modo. Ecco alcuni dei il codice che si avvicinò conContare i nucleotidi del DNA usando perl 6

use v6; 

my $default-input = "AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC"; 

sub MAIN(Str $input = $default-input) 
{ 
    say "{bag($input.comb)<A C G T>}"; 
} 



use v6; 

my $default-input = "AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC"; 

sub MAIN($input = $default-input) 
{ 
    "{<A C G T>.map({ +$input.comb(/$_/) })}".say; 

set di dati campione
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC

+0

Qual è il problema o la domanda? –

+0

la mia domanda è un altro modo per ottenere lo stesso risultato del conteggio delle singole lettere oltre ai codici incollati lì – Oluwole

risposta

7
multi sub MAIN (\DNA) { 
    my Int %bag = A => 0, C => 0, G => 0, T => 0; 

    # doesn't keep the whole thing in memory 
    # like .comb.Bag would have 
    for DNA.comb { 
    %bag{$_}++ 
    } 
    .say for %bag<A C G T> :p; 
} 

multi sub MAIN ('example'){ 
    samewith "AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC" 
} 

multi sub MAIN (Bool :STDIN($)!){ 
    samewith $*IN 
} 

multi sub MAIN (Str :filename(:$file)! where .IO.f){ 
    samewith $file.IO 
} 
~$ ./test.p6 
Usage: 
    ./test.p6 <DNA> 
    ./test.p6 example 
    ./test.p6 --STDIN 
    ./test.p6 --filename|--file=<Str> 

~$ ./test.p6 example 
A => 20 
C => 12 
G => 17 
T => 21 

~$ ./test.p6 --STDIN < test.in 
A => 20 
C => 12 
G => 17 
T => 21 

~$ ./test.p6 --file=test.in 
A => 20 
C => 12 
G => 17 
T => 21 
+2

Ho inviato una [richiesta pull] (https://github.com/perl6/doc/pull/509) per una minima documentazione di 'samewith' basata sul tuo uso di questo qui. Un'altra caratteristica interessante di Perl6 che non avevo mai visto prima. Grazie! –

+0

potresti persino aggiungere la gestione degli errori e un nome di file predefinito nella firma 'multi sub MAIN (Str: input (: $ f) dove {.IO.f // die" file non trovato in $ * CWD "} = 'dolly .txt ') ' –

3

Un altro modo è quello di utilizzare il BioInfo modules I'm working on che hanno una coercizione per Bag già per voi :)

use v6; 
use BioInfo; 

my @sequences = ` 
>seqid 
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC 
`; 

for @sequences -> $seq { 
    say $seq.Bag; 
} 

Nel codice precedente si sta importando uno speciale slang bioinformatico che capisce che le stringhe letterali tra `` sono letterali FASTA. DNA/RNA/amminoacidi vengono rilevati automaticamente e si ottiene una classe specifica per quello. L'oggetto ha la sua .Bag che fa quello che vuoi. Oltre ai miei moduli c'è anche il progetto BioPerl6.

Se si vuole leggere dal file quindi il seguente dovrebbe funzionare per voi:

use v6; 
use BioInfo::Parser::FASTA; 
use BioInfo::IO::FileParser; 

#Spawn an IO thread that parses the file and creates BioInfo::Seq objects on .get 
my $seq_file = BioInfo::IO::FileParser.new(file => 'myseqs.fa', parser => BioInfo::Parser::FASTA); 

#Print the residue counts per file 
while my $seq = $seq_file.get() { 
    say $seq.Bag; 
} 
+1

Grazie mille. Lo proverò – Oluwole

Problemi correlati