我有一个字符串
[something]text1[/something] blah blah [something]text2[/something]
我需要编写一个Perl脚本来读取[something]
标记中的内容,将其处理为“text-x”,然后将其放回[otherthing]
标记。所以上面的字符串应该是
[otherthing]text-1[/otherthing] blah blah [otherthing]text-2[/otherthing]
将“textx”处理为“text-x”不是一个步骤。
所以这是我迄今为止的解决方案:
m/[something](?<text>.*)[/something]/
这会在中间输入字符串,我可以将其处理为“text-x”,但如何将其放回[otherthing]text-x[/otherthing]
的同一位置?
答案 0 :(得分:2)
您可以使用/e
上的s///
开关在使用结果作为替换之前评估右侧,并使用/g
标志为每次匹配执行此操作。
这是一个简单的例子:
use 5.12.0;
my $str = ">1< >2< >34<";
$str =~ s/>(\d+)</">>".process("$1")."<<"/eg;
say $str;
sub process {
return "x" x $_[0];
}
答案 1 :(得分:1)
这应该接近了。它使用/ e修饰符允许您在正则表达式的替换方面进行处理,因此它调用fix_textx函数,您可以在其中执行多个步骤。
迭代匹配的常规方法是使用/ g修饰符。
#!/usr/bin/perl
use strict;
use warnings;
my $string = '[something]text1[/something] blah blah [something]text2[/something]';
$string =~ s{\[something\](text[^[]*)\[\/something\]}
{'[otherthing]' . fix_textx($1) . '[/otherthing]'}ge;
print $string;
sub fix_textx {
my ($testx) = @_;
$testx =~ s/text\K(.*)/-$1/;
return $testx;
}
编辑:修正了方括号。谢谢@tadmc
答案 2 :(得分:0)
在这种特殊情况下,您可以通过在"[something]"
上拆分字符串然后处理每个部分的开头(第一个除外)来完成您要执行的操作,然后将这些部分重新组合在一起你已经完成了。
我不知道是否有一种通用的方法来迭代Perl中字符串中的正则表达式匹配。我希望其他人能回答这个问题并教育我。