In perl I want to achieve the following translation:
stmt1; gosub xyz;
to
stmt1; xyz();
How can I do this?
In perl I want to achieve the following translation:
stmt1; gosub xyz;
to
stmt1; xyz();
How can I do this?
すでに与えられた答えはおおよその答えを提供しています。これはあなたのエッジケース(セミコロンの欠落、セミコロンの後の追加節)に対処します。
perl -plwe 's/\bgosub\s+([^;]+)/$1()/g'
gosubキーワードの後に「セミコロンではない」空白が続く任意の文字列に一致し、それらを削除します。また、global 修飾子も追加しました/g。これは、可能なすべての置換を 1 行で行いたいと思われるためです。単語境界\bを使用して部分一致を防ぐことに注意してください。たとえば、 replace を使用しないでくださいlegosub。
単語の境界が十分でない場合、たとえば、単語の文字間に区切りが生じる1.gosubために置換される.場合は、代わりに否定の後読みを使用できます。
perl -plwe 's/(?<![^;\s])gosub\s+([^;]+)/$1()/g'
これには、前の文字gosubがセミコロンまたは空白以外のものではないことが必要です。二重否定は、不一致 (行頭) も許可することに注意してください。
編集するファイルのコマンド ラインから実行します (file.ext を置き換えます)。
perl -i.bk -pe 's/gosub (.*?);/$1()/g' file.ext
my $str = 'stmt1; gosub xyz;';
$str    =~ s/gosub (.*?);?/$1();/;
print $str;