/r 保留原来变量的值不变,返回替换后的新值
$+{name} 保存命名正则(?<name>...)最近一次匹配的内容
@{ $-{name} } 保存命名正则(?<name>...)多次匹配的内容
假设 $pattern_str 是正则式匹配串:
- 如果在某个循环中, ... if(/$pattern_str/) 则每次调用都会重复编译成正则式
- 如果在进入循环之前,先 $pattern = qr/$pattern_str/,则 ... if(/$pattern/) 每次调用不会重复编译成正则式
use re 'debug'; 可以看正则式解析过程
NFA会记录上次匹配位置,失败后回溯,再到下一个位置重复尝试匹配
(?> PATTERN) 与 (?: PATTERN) 用法类似,但 (?> PATTERN) 只要能匹配上,不管后续整体正则式匹配是否成功,都不回溯。
好处在于失败时能够迅速跳出,不尝试多余都回溯;当然,(?> PATTERN) 的"失败"有可能是判断错误的。
例子: "aaab" =~ /(?:a*)ab/ 成功, "aaab" =~ /(?>a*)ab/ 失败
(?>.+) 可以缩写为 .++
s/(\d+)/$1 * 2/e; # Replaces "42" with "84"
s/PATTERN/CODE/ee 相当于 s/PATTERN/eval(CODE)/e
(?{ CODE }) 好麻烦,暂时跳过不看了,P299
(?(COND)IFTRUE|IFFALSE) 比较帅!
perl支持切换正则引擎,例如re::engine::RE2等。
RE2的相关资料:
- Regular Expression Matching Can Be Simple and Fast
- Regular Expression Matching: The Virtual Machine Approach
- Regular Expression Matching in the Wild
没有评论:
发表评论