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

标签 regex function perl

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

相关文章:

php - 检查字符串是否与模式匹配

Jquery 定义一个函数并将其作为所选对象的方法调用?

regex - perl 正则表达式不匹配带有换行符的字符串\n

Perl 线程比顺序处理更快?

linux - 在 Bash 中从另一个较大文件中查找文件行的最快方法

regex - 匹配恰好包含 10 个数字的字符串的正则表达式

regex - 如何在flex中匹配一串流浪字符(不匹配其他正则表达式)?

java - 重复的正则表达式

javascript - 无法将箭头函数的参数转换为接口(interface)?

c - C 中的 Malloc - 返回值