使用Regexp :: Grammars从文件中解析标记

时间:2013-06-04 18:09:59

标签: perl regexp-grammars

我正在尝试使用Perl和Regexp::Grammars CPAN模块从程序中的注释中捕获免费标记。

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

如何匹配输入数据中的所有代码?

并且...如何在不打开嘈杂的上下文字符串的情况下(删除nocontext:指令)来匹配标记的字符串,以便最终结果更具可读性,即:

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

1 个答案:

答案 0 :(得分:0)

找到它:

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

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

产生以下YAML:

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