【问题标题】:Generating sets of array in perl在 perl 中生成数组集
【发布时间】:2012-09-11 08:13:23
【问题描述】:

给定 perl 脚本在“E”处剪切输入序列并跳过@nobreak 中提到的“E”的那些特定位置,并生成一个片段数组作为输出。但是我想要一个脚本,它为每个已跳过的位置在输出中生成一组这样的数组,并考虑到@nobreak 的所有位置。假设第 1 组包含在“E”37 处跳过后产生的片段,第 2 组在“E”45 处跳过后产生,依此类推。下面提到的我编写的脚本无法正常工作。我想在输出中生成 4 个不同的数组,一次占用一个 @nobreak 的位置。请帮忙!

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";
}

【问题讨论】:

  • 添加您期望的输出将有助于破译您的要求。 @ysth 可能是对的,但我不太确定......

标签: arrays perl set perl-data-structures


【解决方案1】:

要在每个 'E' 处拆分字符串而不在过程中消耗它,请使用后向:

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

为了更好地控制拆分哪个“E”(您未指定),将对正则表达式进行更改。

如果需要变量lookbehind,可以使用\K...

【讨论】:

    【解决方案2】:

    循环遍历@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";
    }
    

    【讨论】:

      【解决方案3】:

      您似乎想在所有E 字符之后 拆分字符串,但不是在 任何P 字符之前

      此代码将执行您想要的操作。它的工作原理是将@nobreak 中每个偏移量处的E 更改为e(比"\0" 调试要好得多)并在/(?&lt;=E)(?!P)/ 上拆分 - 即在E 之后但不在P 之前.之后使用tr/e/E/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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 2019-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多