2

「E」が出現するたびに文字列が断片化され、ユーザーがコマンドラインから「C」の位置を入力するPerlスクリプトを作成しようとしています(たとえば、3-8または3-8,13-18またはコンマで区切られたものなど)文字列が長い場合、そのような形式の文字列に応じて「C」の位置)、「C」を含むフラグメント (たとえば、3 と 8 の位置) を結合して、出力に表示する必要があります。文字列が「ABCDEABCDEABCDEABCDEABCDE」で、ユーザーが 3 ~ 8 を入力すると、プログラムの出力は次のようになります。

ABCDEABCDE
ABCDE
ABCDE
ABCDE

ユーザーがコマンドラインから「C」の位置を入力すると、文字列が「E」のすべての位置で切り取られるスクリプトを作成しましたが、その後は正しく記述できません。助けてください!

これまでに書いたコード(編集済み)は次のとおりです。

use strict;
use warnings;

my $s = 'ABCDEABCDEABCDEABCDEABCDE';
my $i=0;
my @where;
my @array;
my @bond;
my @pos;
my @s_array;
my @s_array2;

for ($i=0; $i<=4; $i++) {
    $where[$i] = index($s,"C",$where[$i-1])+1;
    push(@array,$where[$i]);
}
print "All Positions of C: @array\n\n";
print "Enter C positions:\n";
my @join_C = <STDIN>; 

foreach (@join_C) {
    @bond = split (',',$_);
}

foreach (@bond) {
    @pos = split ('-', $_);
}
print "entered C positions:@pos\n";
print "Resulting disulfide linked peptides\n\n";
my @a = split(/E/, $s); 
my $result = join ("E,", @a);
my @final = split(/,/, $result);
foreach my $final (@final) {
    foreach my $pos(@pos) {
        my @source = split //, $final[@final];
        my $length = @source;
        for ($i=0; $i<=$length; $i++) {
            if (index($final[$i], "C") == $pos[$i]) {
                push (@s_array, $final[$i]);
            }
            else {
                push (@s_array2, $final[$i]);
            }
        }
    }
}
my $lastly_joined = join (',', @s_array);
print "Joined Fragments= @s_array\n";
print "Remaining fragments= @s_array2\n";
4

1 に答える 1

0

私はあなたが何をしたいのか理解しようとします。

「E」が出現するたびに文字列が断片化される Perl スクリプトを作成しようとしています。

さて、最初に入力を作成します。配列を使用して要素へのアクセスを容易にしましょう。

my @s = split ('', 'ABCDE' x 5);

あなたの場合、その文字列がどのように見えるかわかりません。現実世界の例を教えてください。

また、ユーザーがコマンド ラインから「C」の c_pos を入力した場合 (文字列が長い場合は、3-8 または 3-8,13-18、またはそのような形式の文字列に従って「C」の c_pos をカンマで区切ったものなど)

コマンドライン引数を使用することをお勧めします。これにより、後で他のツールと一緒にチェーンでスクリプトを使用しやすくなります。引数をスクリプトに渡します。

script.pl 3-8,13-18

したがって、ペアのリストを取得します。

my @pairs = split (',', join('', @ARGV));

ここで、渡された値が「C」を指していることを確認する必要があります。有効な組み合わせは、キーが開始インデックスで値が終了インデックスであるハッシュに格納されます。

my %c_pos; 
foreach my $pair (@pairs) {
   my ($from, $to) = split('-', $pair);
   if (($string[$from-1] eq 'C') && ($string[$to-1] eq 'C')) {
      $c_pos{$from-1} = $to-1;
   } else {
      warn "position ${from}-${to} not valid => ignored!\n";
   }
}

「C」を含むフラグメント (たとえば 3 と 8 の位置) を結合して、出力に表示する必要があります。

これで、@s の要素を反復処理できます。開始インデックスに到達すると「接続」が開始され、この接続は最後に到達するまでアクティブになります。

すべての値を現在のエントリに保存します。

「E」を押して「接続」にない場合、現在のエントリが結果にプッシュされ、次の空のエントリから開始します。

for (my $i=0; $i<@string; $i++) {

   if ($c_pos{$i}) {
       $inside_connection = 1;
       $end = $c_pos{$i}; 
   } elsif ($i == $end) {
       $inside_connection = 0;
       $end = 0;
   }

   $entry.=$string[$i];

   if ($inside_connection) {
      # do not split on 'E'
   } elsif ($string[$i] eq 'E') {
      # split on 'E'
      push @result, $entry;
      $entry = '';
   }
} 

よくわからないので、3-8、8-13 のような連鎖接続により、3-13 と同じように機能すると想定しました。それが合うことを願っています。完全なスクリプトは次のとおりです。

use strict;
use warnings;

my @string = split ('', 'ABCDE' x 5);       

my @pairs = split (',', join('', @ARGV));   

my %c_pos; 
foreach my $pair (@pairs) {
   my ($from, $to) = split('-', $pair);
   if (($string[$from-1] eq 'C') && ($string[$to-1] eq 'C')) {
      $c_pos{$from-1} = $to-1;
   } else {
      warn "position ${from}-${to} not valid => ignored!\n";
   }
}

my @result;
my $entry = '';
my $inside_connection = 0;
my $end=0;

for (my $i=0; $i<@string; $i++) {

   if ($c_pos{$i}) {
       $inside_connection = 1;
       $end = $c_pos{$i}; 
   } elsif ($i == $end) {
       $inside_connection = 0;
       $end = 0;
   }

   $entry.=$string[$i];

   if ($inside_connection) {
      # do not split on 'E'
   } elsif ($string[$i] eq 'E') {
      # split on 'E'
      push @result, $entry;
      $entry = '';
   }
} 

print join ("\n", @result);
于 2013-02-05T08:28:48.843 に答える