/ / Cómo cambiar dos bases en la posición especificada por el usuario - perl, bioinformática

Cómo cambiar dos bases en la posición especificada por el usuario - perl, bioinformática

Soy un principiante en PERL trabajando en la pregunta anterior. entonces recibí este error empalme () offset más allá del final de la matriz, después de usar use strict;

Pasé horas modificando el código, pero fue en vano, así que ¿podría alguien explicarme por qué no funciona lo más posible (soy un novato total)?

¡Gracias!

#!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

Los mejores deseos, Wei

Respuestas

0 para la respuesta № 1

Si todo lo que quiere hacer es intercambiar dos elementos en una matriz, no necesita splice en absoluto. Un rebanada de matriz hace el trabajo mucho más fácil y eficientemente:

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

o, si ya tiene los valores del elemento guardados en variables escalares:

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

o simplemente:

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

(La situación donde necesitas splice es cuando desea reemplazar una secuencia de elementos en el medio de la matriz con una secuencia de diferente longitud. Pero si solo quiere reemplazar algunos elementos sin cambiar la longitud de la matriz, una asignación de división funcionará bien).


1 para la respuesta № 2

Solo cambia estas dos líneas:

@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

a:

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

Como se dijo en el doc:

empalme ARRAY o EXPR, DESPLAZAMIENTO, LONGITUD, LISTA
Elimina los elementos designados por OFFSET yLONGITUD de una matriz, y los reemplaza con los elementos de LIST, si hay alguno. En contexto de la lista, devuelve los elementos eliminados de la matriz. En contexto escalar, devuelve el último elemento eliminado, o undef si no se eliminan elementos.