【问题标题】:How can I substitute regexp matches and map the substitutions in Perl?如何替换正则表达式匹配并在 Perl 中映射替换?
【发布时间】:2009-01-07 14:05:49
【问题描述】:

即:

echo H#97llo | MagicPerlCommand

标准输出:

Hallo

MagicPerlCommand 类似于

perl -pnle "s/#(\d+)/chr(\1)/ge"

(但这不起作用)。

【问题讨论】:

    标签: regex perl substitution


    【解决方案1】:

    在 MagicPerlCommand 中将 \1 更改为 $1\digit 反向引用样式在评估替换表达式时不起作用(即s///e)。

    这在 Windows 和 Linux 上对我有用。

    【讨论】:

      【解决方案2】:

      根据j_random_hacker 的答案,您必须使用$1 而不是\1

      这是因为在正则表达式中使用“/e”修饰符意味着右手边只是另一个普通的 Perl 表达式,而不是正则表达式替换。由于它是 Perl,所以您必须使用 Perl 的语法作为括号引用,而不是通常的正则表达式语法。

      【讨论】:

      • 是的,这是有道理的。但奇怪的是 echo H#97llo | perl -pnle "s/#(\d+)/chr(\1)/ge" 实际上返回了一些东西(这不是一个例外)。
      • 在我的机器(Linux FC10 和 Mac OS X)上,您的代码会产生警告“打印中的宽字符”。它将 \1 视为对标量的引用。
      • 请注意,它在 Windows 中会产生相同的警告,这让我的美味评论变得愚蠢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2022-08-10
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多