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 № 1Si 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.