0

In perl I want to achieve the following translation:

stmt1; gosub xyz;

to

stmt1; xyz();

How can I do this?

4

3 に答える 3

1

すでに与えられた答えはおおよその答えを提供しています。これはあなたのエッジケース(セミコロンの欠落、セミコロンの後の追加節)に対処します。

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がセミコロンまたは空白以外のものではないことが必要です。二重否定は、不一致 (行頭) も許可することに注意してください。

于 2012-12-18T11:47:47.860 に答える
1

編集するファイルのコマンド ラインから実行します (file.ext を置き換えます)。

perl -i.bk -pe 's/gosub (.*?);/$1()/g' file.ext
于 2012-12-18T10:10:17.930 に答える
0
my $str = 'stmt1; gosub xyz;';
$str    =~ s/gosub (.*?);?/$1();/;

print $str;
于 2012-12-18T10:08:12.650 に答える