2014-09-26 36 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。

相關問題