繁体   English   中英

在正则表达式中使用匹配组的长度

[英]Using the length of the matched group inside regex

假设这个

char=l
string="Hello, World!"

现在,我想在从STDIN读取时替换string所有char但连续出现(运行长度编码)

我试过这个:

$c=<>;$_=<>;print s/($c)\1*/length($&)/grse;

当输入为

l
Hello, World!

它返回Hello, World! . 但是当我运行这个

$c=<>;$_=<>;print s/(l)\1*/length($&)/grse;

它返回He2o, Wor1d

所以,由于输入是在单独的行中给出的, $c包含\\n (检查$c=~/\\n/ )所以,我试过了

$c=<>.chomp;$_=<>;print s/($c)\1*/length($&)/grse;

$c=<>;$_=<>;print s/($c.chomp)\1*/length($&)/grse;

都没有工作。 谁能说一下为什么?

在 Perl 中, . 用于连接字符串,而不是调用方法(与其他一些语言不同;例如 Ruby)。 查看chomp文档以了解它应该如何使用。 你应该做

chomp($c=<>)

而不是

$c=<>.chomp

因此,您的完整代码应该是:

chomp($c=<>);$_=<>;print s/($c)\1*/length($&)/grse;

如果$c始终是单个字符,则正则表达式可以简化为s/$c+/length($&)/grse 此外,如果$c可以是正则表达式元字符(例如, +*([等),那么您应该对其进行转义(为了以防万一,转义它是有意义的)。为此,您可以使用\\Q..\\E (或quotemeta ,虽然它更冗长,因此可能不太适合单行):

s/\Q$c\E+/length($&)/grse

如果您不$c某种方式转义$c ,并且您的单行使用(例如作为第一个输入运行,您将收到以下错误:

Quantifier follows nothing in regex; marked by <-- HERE in m/(+ <-- HERE / at -e line 1, <> line 2

关于$c=<>.chomp在 Perl 中的实际含义(因为这是一个在某些上下文中有意义的有效 Perl 代码):

$c=<>.chomp表示<>连接到chomp ,其中没有参数的chomp被理解为chomp($_) chomp返回删除的字符总数,由于$_为空,所以没有删除任何字符,这意味着这个chomp返回0 所以你基本上是在写$c=<>.0 ,这意味着如果你的输入是l\\n ,你最终会得到l\\n0而不是l

自己调试此类的一种方法是:

  • 使用-w标志启用警告。 在那种情况下,它会打印

    Use of uninitialized value $_ in scalar chomp at -e line 1, <> line 1.

    这可以说不是有史以来最有用的警告,但它会帮助你了解你的错误在哪里。

  • 打印变量以确保它们包含您期望的内容。 例如,你可以 co perl -wE '$c=<>.chomp;print"|$c|"' ,它会打印:

     |l 0|

    这应该有助于让您了解出了什么问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM