Perl调用正则表达式替换中的tr函数

xpt*_*xpt 2 regex perl function

如何正确使用tr正则表达式替换中的结果?

echo 'E2"C"G | d3"G7" | F3"F" | A3"Dm" ' | perl -pe 's{".*?"}{$& =~ tr [\000-\177][\200-\377]r}ge;'
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试利用结果tr 构造想要的东西时,这符合预期,

echo 'E2"C"G | d3"G7" | F3"F" | A3"Dm" ' | perl -pe 's{".*?"}{$& =~ tr [\000-\177][\200-\377]r; " %$&% ";}ge;'
Run Code Online (Sandbox Code Playgroud)

事情开始崩溃(8 位设置的字符串消失了)。
请问如何解决?(我尝试分配$&给一个变量$m并使用$m它,但这并没有解决问题)

zdi*_*dim 5

$& 变量是只读的,因此tr运算符无法更改它,这就是为什么您将其与修饰符tr一起使用 - 然后它返回更改后的字符串(如果没有更改,则返回未更改的原始字符串)并保持原始字符串不变/r

\n

因此将返回值分配给一个变量,然后使用该变量

\n
s{...}{ my $new = $& =~ tr[...][...]r; " %$new% " }\n
Run Code Online (Sandbox Code Playgroud)\n

($new可能与旧的相同,$&) \xc2\xa0\nor 直接组成您需要的表达式

\n
s{...}{ " %" . $& =~ tr[...][...]r . "% " }\n
Run Code Online (Sandbox Code Playgroud)\n
\n

鉴于问题中的括号注释

\n
\n

(我尝试分配$&给一个变量$m并使用$m它,但这并没有解决问题)

\n
\n

另一种方法是首先复制$&到变量中,然后按照您的意愿使用它

\n
{...}{ my $m = $&; $m =~ tr[...][...]; " %$m% " }\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,现在我们不需要修饰符/r,因为$m应该就地更改它(使用 不会发生什么/r

\n