在 perl 中,我想实现以下翻译:
stmt1; gosub xyz;
到
stmt1; xyz();
我怎样才能做到这一点?
在要编辑的文件上从命令行运行(替换 file.ext):
perl -i.bk -pe 's/gosub (.*?);/$1()/g' file.ext
已经给出的答案提供了近似答案,这将处理您的边缘情况(缺少分号,分号后的附加子句)。
perl -plwe 's/\bgosub\s+([^;]+)/$1()/g'
它将匹配gosub
关键字后面的任何字符序列,然后是“非分号”的空格并将它们删除。我还添加了/g
全局修饰符,因为您可能希望在一行上进行所有可能的替换。请注意使用单词边界\b
来防止部分匹配,例如不替换legosub
。
如果单词边界不够,例如它将替换1.gosub
,因为.
导致单词字符之间的中断,您可以使用否定的lookbehind代替:
perl -plwe 's/(?<![^;\s])gosub\s+([^;]+)/$1()/g'
这要求之前gosub
的任何字符都不是分号或空格之外的任何字符。请注意,双重否定也允许不匹配(行首)。
my $str = 'stmt1; gosub xyz;';
$str =~ s/gosub (.*?);?/$1();/;
print $str;