2013-08-12 4 views
2

Я пытаюсь совместить первое и второе вхождение строки в perl. Первые несколько строк ввода (содержащиеся в @intersect) являются:regex match второе вхождение строки в Perl

  '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 (которые отделены друг от друга вкладок) , используя следующие:

#!/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\[email protected]_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, а вторая на @condition2_match?

ответ

4

Что происходит, так это то, что ваши регулярные выражения соответствуют как можно больше, где у вас есть .*. Что вам нужно сделать, это сделать квантификатор ленивым (не жадным), и это делается путем добавления вопросительного знака ?.

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

Таким образом, регулярное выражение будет соответствовать минимально возможные символы, пока «не видит» Change:(-?\d+\.\d+)/g).

Вы можете проверить на некоторых сайтах регулярных выражений, что вы точно соответствуете, например this site.

+0

Фантастический! Благодарю. – fugu

+0

@Nick Добро пожаловать! Я добавил еще немного контента и сайта, чтобы помочь вам всякий раз, когда у вас есть регулярное выражение. ^^ – Jerry

+0

+1 для ответа, данного @jerry. – igotmumps

Смежные вопросы