14

これは5.8と5.10で機能していましたが、5.12では私のコードがこの奇妙な非qrオブジェクトを作成します。

# running "print Dumper($regex)"
$VAR1 = bless( do{\(my $o = '')}, 'Regexp' );

私のコードで作成されていないqr//を印刷すると、次のようになります。

# running "print Dumper(qr/foo/i)"
$VAR1 = qr/(?i-xsm:foo)/;

私のコードは基本的に:

REGEXP *rx = re_compile(pattern, flags);
SV *regex = sv_2mortal(newSVpv("",0));

sv_magic(regex, (SV*)rx, PERL_MAGIC_qr, 0, 0);

stash = gv_stashpv("Regexp", 0);
sv_bless(newRV((SV*)regex), stash);

5.12の文字列から正規表現を正しく作成する方法を知っている人はいますか?

4

3 に答える 3

12

私を正しい軌道に乗せてくれてありがとう、みんな、私はこれを真剣に考えすぎていたことがわかりました。彼らは魔法の線を切り取っただけで、PVを作成しません。

Perl5.12で行う必要があるのはこれだけです。

REGEXP *rx = re_compile(pattern, flags);
SV *regex = newRV((SV*)rx);

stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);
于 2010-04-21T19:21:49.717 に答える
6

hobbsによるこの回答のコメントを見てください。読みやすくするために、以下にコピーしました。

正規表現オブジェクトは、魔法を使ったスカラーへの参照ではなく、REGEXPタイプのスカラーへの参照になっているため、5.12.0では実際にはわずかに「コア」になります。ただし、これは、オーバーロードされた文字列化をバイパスすることができない限り、ユーザーコードからは完全に見えません。その場合、正規表現はRegexp = SCALAR(0x1234567)ではなくRegexp = REGEXP(0x1234567)として出力されるようになります。

私はXSに特に精通していませんが、正規表現を作成するためにスカラー値を使用することはもうできないと思います。

于 2010-04-21T18:40:11.210 に答える
5

Perl 5.12は、正規表現をファーストクラスのオブジェクトに変更しました。これは、スカラーにコンパイル済みの正規表現が含まれているかどうかを確認するにはどうすればよいですか?

私はXSの人間ではないので、コードを機能させるためにコードを何に変更する必要があるのか​​わかりません。perlソースで「REGEXP」を検索すると、新しいものを使用するためにコアモジュールに加えられた修正が表示されます。

于 2010-04-21T18:42:44.197 に答える