2014-09-26 67 views
1

我是PERL的初学者,负责解决上述问题。所以我得到这个错误 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

您能否提供示例输入来演示该问题? – choroba 2014-09-26 16:38:47

回答

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的情况是当你想用一个长度不同的序列替换数组中间的一系列元素时。但是如果你只是想在不改变阵列长度的情况下替换某些元素,则切片分配将会很好。)

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说:

splice ARRAY或EXPR,OFFSET,LENGTH,LIST
从数组中删除由OFFSET和LENGTH指定的元素, 并用LIST元素(如果有)替换它们。在列表上下文中, 返回从数组中移除的元素。在标量上下文中, 返回删除的最后一个元素,如果没有元素被删除,则返回undef。

相关问题