我是PERL的初学者,正在研究上述问题。所以我收到了这个错误 在使用use strict;
之后,splice()偏移超过数组的末尾我花了几个小时修改代码但没有用,所以任何人都可以向我解释为什么它不能像外行那样工作(我是一个新手)
谢谢!
#!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_seq\n\n"; #print output
祝福, 卫
答案 0 :(得分:1)
只需改变这两行:
@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
为:
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
如doc中所述:
拼接ARRAY或EXPR,OFFSET,LENGTH,LIST
从数组中删除OFFSET和LENGTH指定的元素, 并用LIST的元素替换它们,如果有的话。在列表上下文中, 返回从数组中删除的元素。在标量上下文中, 返回删除的最后一个元素,如果没有元素被删除则返回undef。
答案 1 :(得分:0)
如果您要做的就是在数组中交换两个元素,则根本不需要splice
。 array slice可以更轻松有效地完成工作:
@input_seq[$base_1_pos, $base_2_pos] = @input_seq[$base_2_pos, $base_1_pos];
或者,如果已经在标量变量中保存了元素值:
@input_seq[$base_1_pos, $base_2_pos] = ($base_2, $base_1);
甚至简单地说:
$input_seq[$base_1_pos] = $base_2;
$input_seq[$base_2_pos] = $base_1;
(你需要splice
的情况是当你想用不同长度的序列替换数组中间的一系列元素时。但是如果你只是想要在不改变数组长度的情况下替换一些元素,切片赋值就可以了。)