| 修饰符 | 作用 |
|---|---|
| /a | 按照 ASCII 的语义展开 |
| /u | 按照 Unicode 的语义展开 |
| /l | 按照 Locale 的语义展开 |
| /d | 按照 “传统” 行为,即 Perl 自己的推断对字符意义做出最为妥帖的阐释 |
| /i | 进行大小写无关的匹配 |
| /s | 匹配任意字符 |
| /x | 加入空白符(便于模式的阅读 |
/a :
对一些使用频率较高的字符集,Perl 提供了简写,但由于 Unicode 下字符集包含的字符远远多于 ASCII 下的字符集,为了让模式严格按照 ASCII 的范围来匹配,需要追加 ‘/a’ 来对模式进行修饰:
if (/HAL-[\d]+/) {
# 匹配除了 ASCII 里面的 0 到 9 之外
# 还能匹配其他语言中的数字字符,比如蒙古文或泰文计数
}
if (/HAL-[\d]+/a) {
# 按照 ASCII 字符语义解释
}
/i:
用于实现大小写无关的模式匹配:
if (/yes/i) {
# 匹配 YES、yes、Yes 等大小写组合
}
/s:将模式中的每个点号转换成字符集 [\d\D],这样就能匹配到包括换行符在内的任意字符。
$_ = "I saw Barney\ndown at the bowling alley\nwith Fred\nlast night.\n";
if (/Barney.*Fred/s) {
# 没有 /s 上面的判断就会失败
# 因为点号(.)无法匹配换行符
}
/x:允许在模式里随意加上空白符从而更易阅读、理解:
if (/-?[0-9]+\.?[0-9]*/) {
}
if (/-? [0-9]+ \.? [0-9]* /x) {
}
多个修饰符可以组合在一起使用,只需要把它们接在一起写在模式末尾即可,并且不需要考虑先后顺序:
if (/barney.*fred/is) {
# 同时使用 /i 和 /s
}