2016-05-04 22 views
6

Guten Nachmittag, ich versuche zu zählen, wie oft die Buchstaben A C T G in der DNA-Sequenz mit perl6 vorkommen. Ich habe versucht, andere Methoden zu verwenden, um es anders zu machen. Hier sind einige der Code, den ich kam mitZähle DNA-Nukleotide mit 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; 

Beispieldaten
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC

+0

Was ist das Problem oder eine Frage? –

+0

meine Frage gibt es eine andere Möglichkeit für mich, um das gleiche Ergebnis der Zählung der einzelnen Buchstaben zu erreichen, da die Codes, die ich dort eingefügt – Oluwole

Antwort

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

Ich reichte eine [Anforderung ziehen] (https://github.com/perl6/doc/pull/509) für eine minimale Dokumentation von 'samewith' basierend auf Ihrer Verwendung hier. Ein weiteres cooles Perl6-Feature, das ich noch nie zuvor gesehen hatte. Vielen Dank! –

+0

Sie können sogar Fehlerbehandlung und einen Standarddateinamen in der Signatur hinzufügen 'multi sub MAIN (Str: Eingabe (: $ f) wo {.IO.f // sterben" Datei nicht in $ * CWD gefunden ") = 'Dolly .txt ') ' –

3

Eine andere Möglichkeit ist es, die BioInfo modules I'm working on zu verwenden, die einen Zwang zu Tasche haben bereits für Sie :)

use v6; 
use BioInfo; 

my @sequences = ` 
>seqid 
AGCTTTTCATTCTGACTGCAACGGGCAATATGTCTCTGTGTGGATTAAAAAAAGAGTGTCTGATAGCAGC 
`; 

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

Im obigen Code importieren Sie einen speziellen Bioinformatik-Slang, der versteht, dass String-Literale zwischen `` FASTA-Literalen sind. DNA/RNA/Aminosäuren werden automatisch erkannt und Sie erhalten eine bestimmte Klasse dafür. Das Objekt hat seine eigene .Bag, die das tut, was Sie wollen. Neben meinen eigenen Modulen gibt es auch das BioPerl6-Projekt.

Wenn Sie aus der Datei lesen möchten, dann sollten die folgenden für Sie arbeiten:

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

Vielen Dank. Ich werde das ausprobieren – Oluwole