0

今回は最新のPerlを持っています。そして、この爆弾

>perl -e '$pat = q(^).qr{(??{$_})}x; print /$pat/'
Eval-group not allowed at runtime, use re 'eval' in regex m/^(?^x:(??{$_}))/ at -e line 1.

なぜ、これらのいずれかが問題ない場合:

>perl -e 'print /q(^).qr{(??{$_})}x/'

>perl -e '$pat = qr{(??{$_})}x; print /$pat/'

>perl -e '$pat = q(^).qr{$_}; print /$pat/'
4

1 に答える 1

4

perl の警告またはエラー メッセージの意味に対する答えは、常にperldoc perldiagを参照することから始まります。

(F) パターンが補間された値を含む場合と同様に、Perl は実行時にゼロ幅アサーション "(?{ ... })" を含む正規表現をコンパイルしようとしました。これはセキュリティ上のリスクであるため、許可されていません。あなたが主張する場合は、「re 'eval'」プラグマを使用するか、実行時に補間された文字列からパターンを明示的に構築し、それを eval() で使用することで、これを行うことができます。perlre の "(?{ code })" を参照してください。

これは潜在的に非常に安全でない操作であり、ユーザー入力として入力されたコードを直接実行する可能性があるため、明示的に有効にする必要があります。

于 2013-10-24T00:58:04.273 に答える