如何匹配文本并将其替换为基于Perl匹配的计算值?

pyt*_*hor 4 regex perl

我有一个函数,调用它f,它接受一个字符串并返回一个字符串.

我有一个文件,其行如下所示:

stuff:morestuff:stuff*:otherstuff:otherstuff*\n

冒号只显示为分隔符,*仅出现在每个单词的末尾.我想循环遍历文件并用f(stuff)替换所有东西*.上一行会去

stuff:morestuff:f(stuff):otherstuff:f(otherstuff)\n

我可以在几行中做到这一点,但必须有一种方法可以在一个方面做到这一点.

编辑 要清楚,通过f(stuff),我的意思是f调用"stuff",而不是字符串"f(stuff)".

Dav*_*ebb 9

如果使用e选项,s//那么右手表达式将被评估为代码.所以这很简单:

$line =~ s/([^:]+)\*/f($1)/ge;
Run Code Online (Sandbox Code Playgroud)

打破比赛:

  • ( 开始标记模式的一部分
  • [^:] 除了a之外什么都不是 :
  • + 表示这些中的一个或多个,即不是冒号的一个或多个字符
  • ) 结束标记图案的一部分 $1
  • \* 字面意思是一个 *

这种模式依赖于*只出现在每个单词末尾的事实.如果它可能出现在一个字段的中间,你需要稍微调整一下这个模式.

或者,将模式放在一个完整的脚本中:

sub f {
    my $word = shift;
    $word =~ tr/a-z/A-Z/;
    return $word;
}

while (<>) {
    s/([^:]+)\*/f($1)/ge;
    print;
}
Run Code Online (Sandbox Code Playgroud)