0

在 perl 中,我想实现以下翻译:

stmt1; gosub xyz;

stmt1; xyz();

我怎样才能做到这一点?

4

3 回答 3

1

在要编辑的文件上从命令行运行(替换 file.ext):

perl -i.bk -pe 's/gosub (.*?);/$1()/g' file.ext
于 2012-12-18T10:10:17.930 回答
1

已经给出的答案提供了近似答案,这将处理您的边缘情况(缺少分号,分号后的附加子句)。

perl -plwe 's/\bgosub\s+([^;]+)/$1()/g'

它将匹配gosub关键字后面的任何字符序列,然后是“非分号”的空格并将它们删除。我还添加了/g全局修饰符,因为您可能希望在一行上进行所有可能的替换。请注意使用单词边界\b来防止部分匹配,例如不替换legosub

如果单词边界不够,例如它将替换1.gosub,因为.导致单词字符之间的中断,您可以使用否定的lookbehind代替:

perl -plwe 's/(?<![^;\s])gosub\s+([^;]+)/$1()/g'

这要求之前gosub的任何字符都不是分号或空格之外的任何字符。请注意,双重否定也允许不匹配(行首)。

于 2012-12-18T11:47:47.860 回答
0
my $str = 'stmt1; gosub xyz;';
$str    =~ s/gosub (.*?);?/$1();/;

print $str;
于 2012-12-18T10:08:12.650 回答