/ / Jak zmienić dwie bazy na pozycji określonej przez użytkownika - perl, bioinformatyka

Jak zmienić dwie bazy na pozycji określonej przez użytkownika - perl, bioinformatyka

Jestem początkującym w PERL pracującym nad powyższym pytaniem. więc dostałem ten błąd splice () przesuwa się poza koniec tablicy, po użyciu użyłem strict;

Spędziłem godziny modyfikując kod, ale bezskutecznie, więc proszę, proszę, wyjaśnij mi, dlaczego to nie działa jak laika, jak to możliwe (jestem totalnym nowicjuszem)

Dzięki!

#!usr/bin/perl

use strict;
use warnings;

#Ask for input from user
#Then switch two bases at positions specified by the user

print "Enter your DNA string:n";
my @input_seq = split( //, <STDIN> );
chomp @input_seq;
print "First base: ";    #position of first base
my $base_1_pos = <STDIN>;
chomp $base_1_pos;
my $base_1 = "$input_seq[$base_1_pos]";
print "Second base ";    #position of second base
my $base_2_pos = <STDIN>;
chomp $base_2_pos;
my $base_2 = "$input_seq[$base_2_pos]";
@input_seq = splice( @input_seq, "$base_1_pos", 1, "$base_2" );    #splice $base_2 into $base_1
@input_seq = splice( @input_seq, "$base_2_pos", 1, "$base_1" );    #splice $base_1 into $base_2
print "@input_seqnn";                                            #print output

Wszystkiego najlepszego, Wei

Odpowiedzi:

0 dla odpowiedzi № 1

Jeśli chcesz tylko zamienić dwa elementy w tablicy, nie potrzebujesz splice w ogóle. Na kawałek tablicy wykonuje pracę znacznie łatwiej i wydajniej:

@input_seq[$base_1_pos, $base_2_pos] = @input_seq[$base_2_pos, $base_1_pos];

lub, jeśli masz już wartości elementów zapisane w zmiennych skalarnych:

@input_seq[$base_1_pos, $base_2_pos] = ($base_2, $base_1);

a nawet po prostu:

$input_seq[$base_1_pos] = $base_2;
$input_seq[$base_2_pos] = $base_1;

(Sytuacja, w której potrzebujesz splice jest wtedy, gdy chcesz zastąpić sekwencję elementów w środku tablicy sekwencją różnej długości. Ale jeśli chcesz tylko wymienić niektóre elementy bez zmiany długości tablicy, przypisanie plasterka będzie dobrze.)


1 dla odpowiedzi nr 2

Po prostu zmień te dwie linie:

@input_seq= splice (@input_seq, "$base_1_pos", 1, "$base_2");   #splice $base_2 into $base_1
@input_seq= splice (@input_seq, "$base_2_pos", 1, "$base_1");   #splice $base_1 into $base_2

do:

splice (@input_seq, $base_1_pos, 1, $base_2);   #splice $base_2 into $base_1
splice (@input_seq, $base_2_pos, 1, $base_1);   #splice $base_1 into $base_2

Jak wspomniano w doc:

splice ARRAY lub EXPR, OFFSET, LENGTH, LIST
Usuwa elementy oznaczone jako OFFSET iLENGTH z tablicy, i zastępuje je elementami LISTY, jeśli takie istnieją. W kontekście listy zwraca elementy usunięte z tablicy. W kontekście skalarnym zwraca ostatni usunięty element, lub undef, jeśli żadne elementy nie są usuwane.