/ /ユーザーが指定した位置に2つの塩基を切り替える方法 - perl、bioinformatics

ユーザーが指定した位置で2つの塩基を切り替える方法 - perl、bioinformatics

私は上記の質問に取り組んでいるPERLの初心者です。だからこのエラーが出た 私が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_seqnn";                                            #print output

ご多幸を祈る、 魏

回答:

回答№1は0

配列内の2つの要素を入れ替えるだけで済むなら、必要はありません splice まったく。アン アレイスライス 仕事ははるかに簡単かつ効率的です:

@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 配列の途中の要素のシーケンスをシーケンスで置き換える場合です 異なる長さの。しかし、配列の長さを変えずにいくつかの要素を置き換えたい場合は、スライスの割り当ては問題ありません。)


回答№2の場合は1

これらの2つの行を変更してください:

@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を返します。