如何在正则表达式替换中正确使用tr
结果?
echo 'E2"C"G | d3"G7" | F3"F" | A3"Dm" ' | perl -pe 's{".*?"}{$& =~ tr [\000-\177][\200-\377]r}ge;'
这符合预期,但是,当我尝试利用 tr
结果来构建我想要的东西时,
echo 'E2"C"G | d3"G7" | F3"F" | A3"Dm" ' | perl -pe 's{".*?"}{$& =~ tr [\000-\177][\200-\377]r; " %$&% ";}ge;'
事情开始崩溃(8 位设置的字符串消失了)。
请问如何解决? (我尝试将 $&
分配给变量 $m
并使用 $m
代替,但这并没有解决问题)
最佳答案
$& variable是只读的,所以 tr运算符无法更改它,这就是为什么您在其上使用 tr
和 /r
修饰符 - 然后它返回已更改的字符串(或未更改的字符串)如果没有更改,则为原始版本)并保持原始状态不变。
因此将返回值分配给一个变量,然后使用该变量
s{...}{ my $new = $& =~ tr[...][...]r; " %$new% " }
($new
可能与旧的相同,$&
)
或者直接编写您需要的表达式
s{...}{ " %" . $& =~ tr[...][...]r . "% " }
考虑到问题中的括号
(I tried to assign
$&
to a variable$m
and use$m
instead, but that didn't solve the problem)
另一种方法是首先将 $&
复制到变量中,然后按照您的意愿使用它
{...}{ my $m = $&; $m =~ tr[...][...]; " %$m% " }
请注意,现在我们不需要 /r
修饰符,因为 $m
应该就地更改(什么会' /r
不会发生这种情况)
关于regex - Perl调用正则表达式替换中的tr函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77128691/