regex - perl:重构 s/.../.../g -> 而 {}?
问题描述
我有一个可怕的评估替代;这是一个简化版本
$ perl -wpe 's@(for )(\w+)@$1 . "user " . qx/id $2/@ge'
它取代了例如
Stats for root are bad
Stats for user uid=0(root) gid=0(root) groups=0(root)
are bad
是否有将 s/.../.../g 变成循环的习语?就像是
while (m@(for )(\w+)@) {
# explicitly replace match with expression computed over several LOCs
}
或者也许以某种方式使用 map()?
解决方案
这个成语是用s///eg
。不可否认,它比您正在寻找的替代方案更好。
s{pat}{ repl }eg;
相当于
my $out = '';
my $last_pos = 0;
while (m{pat}g) {
$out .= substr($_, $last_pos, $-[0] - $last_pos) . do { repl };
$last_pos = $+[0];
}
$_ = $out . substr($_, $last_pos);
因为您暗示在替换表达式中将执行多个语句,所以我将您的代码编写如下:
s{for \K(\w+)}{
...
...
}eg;
curly 的优点是它们可以嵌套。
推荐阅读
- php - WordPress 联系表 7 不适用于 Xampp 中的 PHP 7.2
- javascript - 从 javascript 中的扁平化 JSON 创建嵌套 json
- azure-devops - 使用存储在 Azure Pipelines 中另一个变量中的变量名称
- javascript - 如何在重新渲染之间为转换后的组件设置动画?
- javascript - 升级react-admin v2到v3,权限一直为空上下文不一致
- c# - 如何在 WPF 中为标签添加新字体?
- error-handling - 错误没有从 rxjava zip 函数中的 observables 冒泡
- javascript - 如何使用 koa ctx body 进行多重响应?
- windows - Windows平台C语言获取串口的DTR和RTS引脚
- delphi - Delphi 使用泛型的属性 getter 函数