/ / próbuje przeanalizować dwie tablice na podstawie ich numerów linii - tablice, perl

próbuje przeanalizować dwie tablice w oparciu o ich numery linii - tablice, perl

Nie wiem, czy to jest sposób na podejścieproblem mam pod ręką. Próbuję przeanalizować sekwencje na podstawie ich nazwy, więc instrukcja if if zrobi to samo. Problem, który mam, polega na powiązaniu każdej linii tablicy z jej odpowiednikiem. (więc nazwa do sekwencji). Sądzę, że numery linii każdej tablicy będą działać.

Zrobiłbym to za pomocą skrótu, ale to nie zadziała, ponieważ nie możesz mieć wielu kluczy o tej samej nazwie.

przykładowe dane

>seq1
aaaaa
>seq2
ggggg
>seq1
atatata

Skrypt mam do tej pory

 open(INPUT_FILE, $ARGV[0]) or die "Cannot open the file: $!";
my @name;
my @sequence;

while (my $line = <INPUT_FILE>) {
if ($line =~ /^>(S+)/) {
push @name, $line;
$line = <INPUT_FILE>;
push @sequence, $line;
}
}

Odpowiedzi:

0 dla odpowiedzi № 1

Czytasz wiersz po wierszu, a następnie próbujesz odczytać dodatkowy wiersz.

Czy mogę zasugerować, że powinieneś używać $/ i ustawianie tego "n>";

#!/usr/bin/perl
use strict;
use warnings;

local $/ = "n>";

while ( <DATA> ) {
my ( $name, $sequence ) = split;
$name=~s/^>//g;   #remove a leading `>`
print "$name => $sequencen";
}

__DATA__
>seq1
aaaaa
>seq2
ggggg
>seq1
atatata

Jeśli twoje „imiona” są unikalne, możesz użyć skrótu doprzechowuj dane. Ale wiąże się to z zastrzeżeniem - bez duplikatów kluczy, a skróty są wyraźnie nieuporządkowane. To nie wydaje się pasować do twoich danych, więc sugerowałbym zamiast tego użyć tablicy skrótów:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

local $/ = "n>";

my @sequences;

while ( <DATA> ) {
my ( $name, $sequence ) = split;
$name=~s/^>//g;   #remove a leading `>`
push ( @sequences, { name => $name, sequence => $sequence } );
}

foreach my $sequence ( @sequences ) {
print $sequence -> {"name"}, " => ", $sequence -> {"sequence"},"n";
}

print Dumper @sequences;

__DATA__
>seq1
aaaaa
>seq2
ggggg
>seq1
atatata

W ten sposób twoja struktura kończy się:

$VAR1 = [
{
"name" => "seq1",
"sequence" => "aaaaa"
},
{
"name" => "seq2",
"sequence" => "ggggg"
},
{
"sequence" => "atatata",
"name" => "seq1"
}
];

Tak jak choroba uwagi w komentarzach - opcja tablic może być również opcją:

#at start of prog
my %sequences;

A potem w pętli:

push ( @{ $sequences{$name} }, $sequence );

Da ci to:

$ VAR1 = { „seq2” => [ „ggggg” ], „seq1” => [ „aaaaa”, „atatata” ] };

Zaletą tego jest to, że będzie się odnosićsekwencje z odpowiednimi kluczami. Wadą byłoby to, że traci on kolejność, którą miałeś w pliku (sekwencje będą w kolejności, w jakiej były widoczne w pliku, ale nazwy nie będą „t).