6

正規表現検索を読み取り、INIファイルから値を置き換えるPerlスクリプトがあります。

これは、キャプチャ変数($1または\1)を使用するまでは正常に機能します。これらは文字通り$1または\1に置き換えられます。

このキャプチャ機能を変数を介して正規表現ビットを渡して機能させる方法はありますか?サンプルコード(iniファイルを使用しない)...

$test = "word1 word2 servername summary message";

$search = q((\S+)\s+(summary message));
$replace = q(GENERIC $4);

$test =~ s/$search/$replace/;
print $test;

これにより、...

word1 word2 GENERIC $4

いいえ

word1 word2 GENERIC summary message

ありがとう

4

4 に答える 4

6

二重評価を使用する:

$search = q((\S+)\s+(summary message));
$replace = '"GENERIC $1"';

$test =~ s/$search/$replace/ee;

$replaceee末尾の二重引用符に注意してくださいs///

于 2012-07-13T11:43:18.943 に答える
0

regex-subにevalを適用してみてください。置換は、外部ファイルからのものであることに注意してください。

eval "$test =~ s/$search/$replace/";
于 2012-07-13T11:50:46.960 に答える
0

もう1つの興味深い解決策は、先読みを使用することです(?=PATTERN)

この場合、例では、置き換える必要があるものだけを置き換えます。

$test = "word1 word2 servername summary message";

# repl. only ↓THIS↓
$search = qr/\S+\s+(?=summary message)/;
$replace = q(GENERIC );

$test =~ s/$search/$replace/;
print $test;
于 2012-07-13T12:14:07.293 に答える
0

amonのソリューションが好きなら、「GENERIC $ 1」は構成ではないと思います(特にその中の「$ 1」の部分)。その場合、先読みを使用しない、さらに簡単な解決策があると思います。

$test = "word1 word2 servername summary message";
$search = qr/\S+\s+(summary message)/;
$replace = 'GENERIC';
$test =~ s/$search/$replace $1/;

もちろん、(?= PATTERN)について本当に悪いことは何もありませんが。

于 2012-07-14T23:39:08.210 に答える