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

Perl to call the tr function in regex replace

提问人:xpt 提问时间:9/18/2023 最后编辑:xpt 更新时间:9/21/2023 访问量:76

问:

正则表达式替换中如何正确使用结果?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

正则表达式 函数 perl

评论

0赞 Ted Lyngmo 9/19/2023
预期结果是什么?顺便说一句,您在第二个 perl 命令的末尾缺少 a。'

答:

5赞 zdim 9/19/2023 #1

$& 变量是只读的,因此 tr 运算符无法更改它,这就是为什么你用修饰符在它上面的原因——然后它返回更改后的字符串(如果没有更改,则返回未更改的原始字符串)并保持原始字符串不变tr/r

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

s{...}{ my $new = $& =~ tr[...][...]r; " %$new% " }

($new可能与旧相同,) 或直接编写所需的表达式$&

s{...}{ " %" . $& =~ tr[...][...]r . "% " }

鉴于问题中的括号注释

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

另一种方法是首先复制到一个变量中,然后随心所欲地使用它$&

{...}{ my $m = $&; $m =~ tr[...][...]; " %$m% " }

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

评论

0赞 zdim 9/19/2023
我假设整体和正则表达式做了需要的事情,通过问题的陈述,它“可以预期地工作tr"
0赞 xpt 9/19/2023
“请注意,现在我们不需要 /r 修饰符,因为该$m应该就地更改”这正是我的尝试失败的原因。谢谢!
0赞 xpt 9/19/2023
是的,括号中的注释确实是后来添加的:)当我认为它应该能够为我的问题增加更多价值时,:)实际上,我做了很多失败的尝试。我确实试图省略我自己,但这次我使用的是 stackoverflow.com/a/77123973/2125837 的答案代码。也就是说,我做了有和没有,但无论哪种情况,结果都不是我预期的。/recho 'E2"C"G | d3"G7" | F3"F" | A3"Dm" ' | perl -pe 's/".*?"/$m=$&; $m =~ tr|\x41-\x7F|xC1-\xFF|; " %$m% "; /ge;'/r
1赞 zdim 9/22/2023
@xpt好的,谢谢你澄清:)我已经删除了我不需要的评论(关于您添加括号评论是多么好,我没有立即注意到等),因为它们与目前存在的 Q-A 无关。只是这样说,这样你的最后一条评论就不会悬在半空中:)