-3

与えられたperlスクリプトは、入力シーケンスを「E」でカットし、@ nobreakで言及されている「E」の特定の位置をスキップし、出力としてフラグメントの配列を生成します。しかし、@ nobreakのすべての位置を考慮に入れて、スキップされたすべての位置の出力にそのような配列のセットを生成するスクリプトが必要です。たとえば、セット1には「E」37でスキップした後に生成されたフラグメントが含まれ、セット2には「E」45でスキップした後に生成されたフラグメントが含まれます。私が書いた以下のスクリプトは正しく機能していません。一度に@nobreakの1つの位置を取得して、出力に4つの異なる配列を生成したいと思います。助けてください!

my $s = 'MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAEDLQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN';

print "Results of 1-Missed Cleavage:\n\n";

my @nobreak = (37, 45, 57, 59);
{
    @nobreak = map { $_ - 1 } @nobreak;

    foreach (@nobreak) {

        substr($s, $_, 1) = "\0";
    } 
    my @a   = split /E(?!P)/, $s;
    $_      =~ s/\0/E/g foreach (@a);
    $result = join "E,", @a; 
    @final  = split /,/, $result;
    print "@final\n";
}
4

3 に答える 3

2

処理中に文字列を消費せずに「E」ごとに文字列を分割するには、後読みを使用します。

my @final = split /(?<=E)/, $str;

どの 'E' で分割するか (未指定のまま) をより細かく制御するには、正規表現に変更を加えます。

変数の後読みが必要な場合は、次を使用できます\K...

于 2012-09-11T14:47:38.750 に答える
1

@nobreak をループしますか?

my $s = 'MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAEDLQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN';
print "Results of 1-Missed Cleavage:\n\n";
my @nobreak = (37,45,57,59);
for my $nobreak (@nobreak) {
    substr($s, $nobreak-1, 1) = "\0";
    my @a = split(/E(?!P)/, $s);
    substr($s, $nobreak-1, 1) = 'E';
    $_ =~ s/\0/E/g foreach (@a);
    $result = join ("E,", @a); 
    @final = split(/,/, $result);
    print "@final\n";
}
于 2012-09-11T08:43:20.157 に答える
0

すべての文字ので文字列を分割したいようですがE、どの文字の前でも分割したくないようですP

このコードは、あなたが望むことを行います。Eat each offset in@nobreakを に変更し(デバッグeよりもはるかに優れています) 、分割することで機能します。を使用して後で変更されます"\0"/(?<=E)(?!P)/EPeEtr/e/E/

use strict;
use warnings;

my $s = 'MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAEDLQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN';

print "Results of 1-Missed Cleavage:\n\n";

my @nobreak = (37, 45, 57, 59);

for my $index (@nobreak) {
  my $ss = $s;
  substr($ss, $index-1, 1) = 'e';
  my @final = split /(?<=E)(?!P)/, $ss;
  tr/e/E/ for @final;
  print "$_\n" for @final;
  print "\n";
}

出力

Results of 1-Missed Cleavage:

MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGE
RGFFYTPKTRRE
AE
DLQVGQVE
LGGGPGAGSLQPLALE
GSLQKRGIVE
QCCTSICSLYQLE
NYCN

MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVE
ALYLVCGERGFFYTPKTRRE
AE
DLQVGQVE
LGGGPGAGSLQPLALE
GSLQKRGIVE
QCCTSICSLYQLE
NYCN

MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVE
ALYLVCGE
RGFFYTPKTRREAE
DLQVGQVE
LGGGPGAGSLQPLALE
GSLQKRGIVE
QCCTSICSLYQLE
NYCN

MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVE
ALYLVCGE
RGFFYTPKTRRE
AEDLQVGQVE
LGGGPGAGSLQPLALE
GSLQKRGIVE
QCCTSICSLYQLE
NYCN
于 2012-09-12T16:06:01.513 に答える