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