2

perl で最初と 2 番目に出現する文字列を一致させようとしています。入力の最初の数行 (@intersect に含まれる) は次のとおりです。

          'gi|112807938|emb|CU075707.1|_Xenopus_tropicalis_finished_cDNA,_clone_TNeu129d01  C1:TCONS_00039972(XLOC_025068),_12.9045:32.0354,_Change:1.3118,_p:0.00025,_q:0.50752  C2:TCONS_00045925(XLOC_029835),_10.3694:43.8379,_Change:2.07985,_p:0.0004,_q:0.333824',
          'gi|115528274|gb|BC124894.1|_Xenopus_laevis_islet-1,_mRNA_(cDNA_clone_MGC:154537_IMAGE:8320777),_complete_cds C1:TCONS_00080221(XLOC_049570),_17.9027:40.8136,_Change:1.18887,_p:0.00535,_q:0.998852  C2:TCONS_00092192(XLOC_059015),_17.8995:35.5534,_Change:0.990066,_p:0.0355,_q:0.998513',
          'gi|118404233|ref|NM_001078963.1|_Xenopus_(Silurana)_tropicalis_pancreatic_lipase-related_protein_2_(pnliprp2),_mRNA  C1:TCONS_00031955(XLOC_019851),_0.944706:5.88717,_Change:2.63964,_p:0.01915,_q:0.998852 C2:TCONS_00036655(XLOC_023660),_2.31819:11.556,_Change:2.31757,_p:0.0358,_q:0.998513',

抽出しようとしている情報は、C1 と C2 (タブで区切られている) の両方の 'Change:[value]' で、次を使用します。

#!/usr/bin/perl -w
use strict; 
use File::Slurp;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

my @log_change;
foreach (@intersect) {
    chomp;
    my @condition1_match = ($_ =~ /(C1:).*Change:(-?\d+\.\d+)/g);
    my @condition2_match = ($_ =~ /(C2:).*Change:(-?\d+\.\d+)/g);
    push @log_change, "@condition1_match\t@condition2_match";
  }

print Dumper (\@log_change);

版画:

      'C1: 2.07985    C2: 2.07985',
      'C1: 0.990066    C2: 0.990066',
      'C1: 2.31757    C2: 2.31757',

つまり、C1 と C2 の値は同じです。私のループが C2 の値を と の両方に格納していることは明らか@condition1_matchです@condition2_match

@condition1_match私の質問は次のとおりです。「Change:[value]」の最初の反復をプッシュし、2 番目の反復を にプッシュするように指定するにはどうすればよい@condition2_matchですか?

4

1 に答える 1

4

何が起こっているかというと、あなたの正規表現は、.*. あなたがする必要があるのは、量指定子を怠け者 (欲張りでない) にすることです。これは、疑問符を追加することによって行われ?ます。

my @condition1_match = ($_ =~ /(C1:).*?Change:(-?\d+\.\d+)/g);
                                  #   ^
my @condition2_match = ($_ =~ /(C2:).*?Change:(-?\d+\.\d+)/g);
                                  #   ^

そうすれば、正規表現は 'sees' になるまで可能な限り少ない文字と一致しChange:(-?\d+\.\d+)/g)ます。

このサイトなど、正確に一致しているものをいくつかのオンライン正規表現サイトで確認できます。

于 2013-08-12T15:51:49.740 に答える