2016-12-21 19 views
2

@amplicon_exon配列から同様の要素(のように)〜@failedampliconsの配列を含む要素を検索したいと思います。 @failedampliconsの各要素は一意であり、@amplicon_exonの1つの要素にのみ一致します。私は2つのループを試しましたが、繰り返し値を取得します。 2つの配列から同様の値を見つけて取得するより良い方法はありますか?ここでPerlは2つの配列から同様の要素を見つけよう

@failedamplicons: example: 
OCP1_FGFR3_8.87 
OCP1_AR_14.89 

@amplicon_exon: example: 
TEST_Focus_ERBB2_2:22:ERBB2:GENE_ID=ERBB2;PURPOSE=CNV,Hotspot;CNV_ID=ERBB2;CNV_HS=1 
OCP1_FGFR3_8:intron:FGFR3:GENE_ID=FGFR3;PURPOSE=CNV;CNV_ID=FGFR3;CNV_HS=1 
OCP1_CDK6_14:intron:CDK6:GENE_ID=CDK6;PURPOSE=CNV;CNV_ID=CDK6;CNV_HS=1 

は、ループのコードのための2つです:

my $i = 0; 
my $j = 0; 

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

    for ($j = 0; $j < @failedamplicons; $j++) { 

     my $fail_amp = (split /\./, $failedamplicons[$j])[0]; 

     #print "the failed amp before match is $fail_amp\n"; 

     if (index($amplicon_exon[$i], $fail_amp) != -1) { 

      #print "the amplicon exon that matches $amplicon_exon[$i] and sample is $sample_id\n"; 
      print "the failed amp that matches $fail_amp and sample is $sample_id\n"; 

      my @parts = split /:/, $amplicon_exon[$i]; 
      my $exon_amp = $parts[1]; 

      next unless $parts[3] =~ /Hotspot/; #includes only Hotspot amplicons 
      my $gene_res = $parts[2]; 
      my $depth  = (split /\./, $failedamplicons[$j])[1]; 
      my @total_amps = (
       $run_name, $sample_id, $gene_res, $depth, $fail_amp, $run_date, $matrix_status 
      ); 

      my $lines = join "\t", @total_amps; 

      push(@finallines, $lines); 
     } 
    } 
} 
+2

"_similar_"であるという正確な基準を指定できますか? – zdim

+0

amplicon_exon要素には、 "。"の前にfailedamplicons要素の完全な文字列を含める必要があります。 OCP1_FGFR3_8:イントロン:FGFR3:GENE_ID = FGFR3;目的= CNV; CNV_ID = FGFR3; CNV_HS = 1'にはOCP1_FGFR3_8が含まれています。 – user3781528

+2

@ user3781528:私はあなたのPerlコードを整理して読めるようにしました。将来は読みやすいコードを投稿してください。 – Borodin

答えて

4

splitgrepはあなたの友達で、リストを反復処理するための慣用的なアプローチがあるとして。最初の配列を繰り返して、一致させる部分だけを抽出します(splitを使用して要素を分割し、最初の項目のみを取ります)。その後、文字列のその部分に正規表現grepを使用します。要素の先頭から2番目の配列:まで:

for my $elem (@failedamplicons){ 
    my $to_match = (split /\./, $elem)[0]; 
    if (my ($matched) = grep {$_ =~ /^\Q$to_match:/} @amplicon_exon){ 
     print "$matched\n"; 
    }   
} 
+1

ありがとう、これは本当に良いです! – user3781528

+1

'$ to_match'のメタ文字がエスケープされるように正規表現を変更します。詳細はhttp://perldoc.perl.org/perlre.html#Quoting-metacharacters – shawnhcorey

+1

@shawnhcorey私の監視を修正してくれてありがとう! – stevieb

関連する問題