Perl正则替换中能否使用反向引用作为哈希表查找键
Perl正则替换中使用捕获内容作为哈希键的实现说明
- 你给出的原始写法无法实现预期效果,存在两处语法问题:
- 匹配段的
Cat没有添加捕获圆括号,不会生成捕获组,没有可供反向引用/捕获变量调用的匹配内容 - 替换段错误使用了正则匹配模式内专用的反向引用写法
\1:替换段属于双引号插值上下文,\1会被直接解析为ASCII码为1的不可见控制字符,无法对应到捕获组内容,替换段获取捕获值需要使用$1这类捕获标量变量
- 匹配段的
- 基础场景下(哈希键就是捕获组的完整内容,不需要额外处理捕获值),不需要额外修饰符,修正语法后即可正常运行:
my %hm; $hm{"Cat"} = "Dog"; while(<>) { s/(Cat)/$hm{$1}/; # 若需要替换一行内所有匹配项,将上一行改为 s/(Cat)/$hm{$1}/g; 即可 print; }
上述代码运行时,输入行中匹配到的Cat会被替换为哈希表中对应键的值Dog。
- 如果你需要对捕获内容做处理(比如大小写转换、字符串截取、数值运算)后再作为哈希键查找,需要给替换操作添加
e修饰符,该修饰符会让Perl把替换段的内容作为可执行代码运行,而非普通字符串插值。示例如下:
my %hm; $hm{"Cat"} = "Dog"; while(<>) { # i修饰符忽略大小写匹配cat类字符串,e修饰符执行替换段代码统一转首字母大写后查哈希 s/(cat)/$hm{ucfirst(lc($1))}/ei; print; }
该示例下输入cat、CAT、cAt等任意大小写形式,都会被正确替换为Dog。
内容的提问来源于stack exchange,提问作者P.Jo
相关产品推荐
相关产品推荐

