06 June 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.
  1. 本来修饰符是放后面的,现在都要放前面了。且每个修饰符都是前面加冒号。
  2. /x 没有了,默认就包含了。需要空格相关的话见下面的操作符 :w(:word)
  3. /m /s 也没了,我们用 $$ 等元字符来操作。
  4. /e 也没了。用 { ... } 来执行代码。
  5. 每一个修饰符都有它的长名字,我们可以高兴写长名就长名高兴写短的就短的。如 :i 的长名字为 :ignorecase 而 :g 的长名字为 :global
  6. 我们可以用 :p5 :perl5 来写 Perl5 的正则表达式。唯一的限制是不能在后面放修饰符。
    if ('22' ~~ m:p5/^\d+$/) { say 'OK'; }
  7. 新修饰符 :c(:countinue), 表示从当前位置 .pos 后开始匹配
    # Perl5
    while $str =~ m/\G(w+)/gc;
    # 等同与 Perl 6
    while $str =~ m:c/ (\w+) /;
  8. :p(:pos) 修饰符表示只在当前位置 .pos 处匹配。它的作用跟以前的 \G 相同(\G 也没了)
  9. :once 只匹配第一次
  10. :w(:words) 将空白字符用 定义的规则代替。
    m:w/ next cmd =   <condition>/
    # 等同于
    m/ <ws> next <ws> cmd <ws> = <ws> <condition>/
    而其中 <ws> 到底是 \s+ 还是 \s*, 由 <?ws> 规则定义。你可以定义你自己的 <?ws>
  11. Unicode 级别的修饰符:
    1. m:bytes / .**{2} / # 匹配两个字节
    2. m:codes / .**{2} / # 匹配两个编码点/codepoint
    3. m:graphs/ .**{2} / # 匹配两个字形/graphemes
    4. m:langs / .**{2} / # 匹配由不同语言定义的两个字符
  12. 前面是数字的修饰符(以数字 3 为例):
    1. 如果后面跟x,这种形式表示匹配的次数。它也可以这么写:x(3)。下面三种是等义的:
      s:3x { (<ident>) = (\N+) $$}{$1 => $2}; # 将 = 转为 =>, $$ 在这里的作用等同于 /m
      s:x(3) { (<ident>) = (\N+) $$}{$1 => $2}
      # 也等同于
      $_.pos = 0;
      s:c{ (<ident>) = (\N+) $$}{$1 => $2} for 1..3;
      上面两种跟最下面那种的区别在于上面是要匹配四次以上才会发生四次(不足四次一次也不发生)。
      如果需要范围,可以使用 :x(1..4)
    2. 如果后面跟的是st, nd, rd 或 th, 则表示只处理第几次。它也可以写作:nth(3)。下面在三种也是等义的:
      s:3rd/(\d+)/@data[$1]/; # 将第三次匹配的数字转为 @data[$1], $1 为匹配的数字
      s:nth(3)/(\d+)/@data[$1]/;
      # 也等同于
      m/(\d+)/ && m:c/(\d+)/ && s:c/(\d+)/@data[$1]/;
      nth() 是接受列表和 junction 的。如要第 1, 4, 6 次可以写为 nth(1|4|6)
      它还可以接受闭包:nth{ something() }
  13. :ov(:overlap) 修饰符,它表示匹配结果的位置都是不一样的(就是说每一个位置最多只能有一个结果)。
    在列表上下文返回所有匹配结果,在标量上下文返回匹配结果的反结/disjunction.
    $str = "abracadabra";
    @substrings = $str ~~ m:overlap/ a (.*) a /;
    # bracadabr cadabr dabr br
  14. :ex(:exhaustive) 修饰符,它将匹配所有可能的结果。其返回值在不同的上下文与 :ov 返回做同样处理。
    $str = "abracadabra";
    @substrings = $str ~~ m:exhaustive/ a (.*) a /;
    # br brac bracad bracadabr c cad cadabr d dabr br

Unfinished

To be continued.


blog comments powered by Disqus