$test="fafa\niEFFa"
$test =~ /(?=EF)/m;
print $&;
无输出
而
$tet =~ /EF/m;
print $&;
输出EF
(?=EF) 是一个 正向先行断言,它的作用是 检查当前位置后面是否紧跟 EF,但 不消耗任何字符。换句话说,它只是检查,而不是匹配实际的字符。
/m 修饰符的作用是让 ^ 和 $ 可以匹配每一行的开头和结尾,但在这里你并没有使用 ^ 或 $,所以 /m 实际上没有影响。
/EF/ 会匹配字符串中所有出现的 EF,因此可以成功匹配到 iEFFa 中的 EF。
$test =~ /i(?<=EF)/
无法匹配,因为当前位置F的左边是EF,而(?<=EF)只断点匹配,不消耗,要能匹配把EF加上:
/iEF(?<=EF)/