Zitat von
SuiRIS
Das übersetzen der Triplets in einen Einbuchstabencode hab ich heut morgen auch hinbekommen. Seht selbst: *stolzbin*
Code:
$hashlaenge = scalar @as; # Anzahl der Elemente im Hash
# Übersetzen der Triplets in Einbuchstabencode.
@nukleotide = @seq_trip;
for ($i = 0; $i <= $hashlaenge; $i++) {
foreach $tri (@nukleotide){$tri =~ s/$triplets[$i]/$as[$i]/ig; # $triplets und $as sind jeweils Werte und Schlüssel des Hashs
}}
Hi, ich habe zwar von Bioinformatik keine Ahnung, aber Deine Lösung bzgl. der Übersetzung fuinktioniert immer nur zufällig
Zunächst mal musst Du wissen, dass ein Hash immer unsortiert ist.
Legt man ein Hash also folgendermaßen an:
Code:
my %Hash = (
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3'
);
so kann es durchaus sein, dass bei einer Ausgabe die Reihenfolge abweicht:
Code:
foreach(keys(%Hash))
{
print $_;
}
1. Ausgabe:
key2
key1
key3
1. Ausgabe:
key1
key3
key2
Der erste grobe Fehler in Deinem Code ist dieser:
Code:
@triplets = keys %hash;
@buchstabe = values %hash;
Damit vernichtest Du unter Umständen die Zuordnung von keys und values, da beim Aufruf der Funktion keys() die Reihenfolge der Schlüssel-Wert-Paare von der beim Aufruf der Funktion values() abweichen kann. Das willst Du sicher nicht.
Der zweite Fehler ist, dass Du Dich beim Übersetzen der Sequenz sicherlich an die Reihenfolge der Triplets in der Sequenz halten musst - nicht an die Reihenfolge, die das Hash vorgibt (da die ja sowieso zufällig ist).
Ich würde daher die Sequenzen erstmal einlesen und alle \n entfernen, so wie Du es ja bereits gemacht hast.
Anschließend würde ich den String in die Triplets auftrennen:
Code:
my @seq_trip = ($sequenz_string =~ m/.{3}/g);
Ab jetzt hast Du in @seq_trip alle Triplets gespeichert - und zwar mit fester Reihenfolge.
Nun fehlt nur noch die Übersetzung. Dabei richtest Du Dich natrülcih nach der Reihenfolge in @seq_trip - also so:
Code:
my @Nukleotide = ();
foreach(@seq_trip)
{
push(@Nukleotide, $Hash{$_});
}
Das Array Nukleotide enthält ab jetzt die translatierte Sequenz.
Zusammengefasst:
Code:
#!/usr/bin/perl
use strict;
use warnings;
my $Sequenzen = 'dateiname.txt';
my $sequenz_string='';
my %Hash = (
"ATG" => "F",
"CCA" => "M",
"TGA" => "F",
"CTG" => "L",
"AAA" => "S",
"GGT" => "L"
);
open(my $fh,"<$Sequenzen");
while(<$fh>)
{
chomp;
$sequenz_string .= $_;
}
close($fh);
my @seq_trip = ($sequenz_string =~ m/.{3}/g);
my @Nukleotide = ();
foreach(@seq_trip)
{
push(@Nukleotide, $Hash{$_});
}
print join(' ', @Nukleotide);
hth, Michael
Lesezeichen