正規表現のフラグを含め、Perl正規表現をシリアライズする必要があるコードに取り組んでいます。フラグのサブセットのみがサポートされているので、/u
のようなサポートされていないフラグが正規表現オブジェクトに含まれていることを検出する必要があります。Perl APIで正規表現をイントロスペクションする方法
コードの現在のバージョンがこれを行う:
static void serialize_regex_flags(buffer *buf, SV *sv) {
char flags[] = {0,0,0,0,0,0};
unsigned int i = 0, f = 0;
STRLEN string_length;
char *string = SvPV(sv, string_length);
手動フラグを見つけるために、string
チャー・バイ・チャーを処理します。
ここでの問題は、regexフラグの文字列化がPerl 5.14で変更されたことです。 (?i-xsm:foo)
〜(?^i:foo)
となり、解析に苦労します。
perl
のバージョンを確認したり、両方のケースを処理するパーサを作成したりできますが、イントロスペクションの優れた方法があることが必要です。
私はこれが道だと思います行く、ありがとう – friedo
@フリード、(未テスト)XSコードを追加しました。 – ikegami
ありがとう、ikegami。私はCコードを出発点として必要なものを手に入れることができました。注目すべきは、戻り値を逆順にポップする必要があることです(つまり、 'flags_sv'が2番目ではなく最初に取り除かれます)。 – friedo