Perl单行命令如何将匹配的模式按捕获的数字n重复对应次数?
Perl单行命令实现Power模式的泛化递归替换
你可以使用Perl替换的/e执行修饰符实现需求,最终单行命令如下:
perl -pe 'while(s/Power\(((?:(?!Power\().)+?),(\d+)\)/"(" . join("*", ("($1)") x $2) . ")"/e){}' file.txt
实现说明
- 正则捕获部分将原硬编码的
2改为(\d+),将匹配到的任意幂次存入捕获组$2 - 替换规则末尾添加
/e修饰符,支持将替换段内容作为Perl代码执行,返回执行结果作为实际替换值 - 替换逻辑用
("($1)") x $2将包裹了括号的待乘内容重复n次,再通过join("*", ...)将重复内容用乘号拼接,最外层额外套一层括号匹配要求的输出格式
效果验证
针对示例输入Power(Power(x,3),2),执行逻辑为:
- 优先匹配最内层的
Power(x,3),替换结果为((x)*(x)*(x)) - 外层表达式变为
Power(((x)*(x)*(x)),2),再次匹配替换后得到最终结果(((x)*(x)*(x))*((x)*(x)*(x))),符合预期。
内容的提问来源于stack exchange,提问作者CrustyPeanut
相关产品推荐
相关产品推荐

