7

構成ファイルに正規表現を保存する Perl プログラムがあります。それらは次の形式です。

regex = ^/d+$

他の場所では、正規表現がファイルから解析され、変数に格納されます - $regex. 次に、正規表現をチェックするときに変数を使用します。

$lValid = ($valuetocheck =~ /$regex/);

たとえば、構成ファイルに perl 変数を含められるようにしたい

regex = ^\d+$stored_regex$

しかし、私はそれを行う方法を理解することはできません。

正規表現が Perl によって解析されると、それらは 2 回解釈されます。最初に変数が展開され、次に正規表現自体が解析されます。

私が必要としているのは、3 段階のプロセスです。最初に interpolateを実行$regexし、次にそれに含まれる変数を補間してから、結果の正規表現を解析します。最初の 2 つの補間は両方とも「正規表現を認識する」必要があります。$たとえば、文字列がアンカーなどとして含まれていることを知っておく必要があります...

何か案は?

4

4 に答える 4

7

次のように、構成ファイルで正規表現を定義できます。

regex = ^\d+(??{$stored_regex})$

ただし、Perl プログラムで次のようにして、正規表現を使用しているブロックのセキュリティ チェックを無効にする必要があります。

use re 'eval';
于 2009-02-09T12:53:49.137 に答える
3

evalを使用すると、ここで役立ちます。後で使用する準備ができている正規表現をプリコンパイルできる次のコードを見てください。

my $compiled_regexp;
my $regexp = '^\d+$stored_regexp$';
my $stored_regexp = 'a';

eval "\$compiled_regexp = qr/$regexp/;";
print "$compiled_regexp\n";

演算子 qr// を使用して正規表現をプリコンパイルできます。ビルドできますが、まだ実行しません。最初にそれを使用して正規表現を構築し、後でそれらを使用できます。

于 2009-02-09T11:48:15.567 に答える
3

Perl 変数は構成ファイル内のスコープに含まれていません。これは良いことだと思います。評価は怖いです。

独自のテンプレートを実装する方がよいでしょう。

したがって、構成ファイルで:

regex = ^\d+__TEMPLATE_FIELD__$

構成ファイルリーダーで:

# something like this for every template field you need
$regex =~ s/__TEMPLATE_FIELD__/$stored_regex/g;

使用時:

$lValid = ($valuetocheck =~ m/$regex/)

テンプレート置換を適用する時点に応じて、これらを移動します。

于 2009-02-09T11:48:53.287 に答える
0

接線方向に関連する落とし穴: インラインで二重補間を行い、変数に置換文字列もある場合は、次のことを考慮してください。

# the concat with doublequotes in the replacement string 
#  are to make them PART OF THE STRING, NOT THE STRING DELIMITERS,
#  in other words, so the 2nd interpolation sees a double quoted string :
#     eval eval $replace -> eval $1 hello world -> syntax error 
#     eval eval $replace -> eval "$1 hellow world"  -> works ok 
# see: http://www.perlmonks.org?node_id=687031  

if($line =~ s/$search/'"' . $replace . '"'/ee) {
     # STUFF... 
}
于 2010-04-09T21:19:04.190 に答える