2013-06-04 2 views
4

나는 CPL 모듈과 Regexp::Grammars CPAN 모듈을 사용하여 프로그램의 주석에서 무료 태그를 캡처하려고합니다.Regexp :: Grammars를 사용하여 파일에서 태그 구문 분석

use strict; 
use v5.10; 
use YAML; 

my $s = q{ 
     junk code; 
     // here be tags #:tag1: 
     junk code 2; 
     // another one #:tag2: 
     junk ...; 
}; 

my $rg = do { 
    use Regexp::Grammars; 
    qr{ 
     <nocontext: > 
     ^.* <Tagger> .* $ 
     <rule: Tagger>   <[MATCH=single_tag]> + 
     <token: single_tag> \#\:<tag>\: 
     <token: tag>   <matchline> \w+ 
    }xms; 
}; 

if($s =~ $rg) { 
    say Dump(\%/);  
} else { 
    say 'no match'; 
} 

그러나 YAML 출력을 보여줍니다 내가 마지막 태그를 캡처하고 있습니다 :

--- 
Tagger: 
    - tag: 
     matchline: 5 
내가 대신 입력 데이터에서 모든 태그를 일치시킬 수 있습니다 어떻게

?

--- 
Tagger: 
    - tag: tag1 
    matchline: 3 
    - tag: tag2 
    matchline: 5 

답변

0

가 발견 : 최종 결과는 좀 더 읽을 수 있도록

그리고 ... 어떻게, 태그의 문자열합니다 (nocontext: 지침을 제거) 시끄러운 상황에 맞는 캐릭터를 켜지 않고도 일치 예를 얻을 수 있습니다 :

--- 
Tagger: 
    - matchline: 3 
    tag: tag1 
    - matchline: 5 
    tag: tag2 
다음 YAML을 산출

my $rg = do { 
    use Regexp::Grammars; 
    qr{ 
     <nocontext: > 

     <Tagger> 
     <rule: Tagger>   <[MATCH=single_tag]>+ % (.*) 
     <token: single_tag> <matchline> \#\:<tag>\: 
     <token: tag>   \w+ 
    }xms; 
};