为什么我不能匹配其部分是在运行时生成的编程模式?

时间:2013-10-23 23:52:34

标签: regex perl

这次我有最新的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/'

1 个答案:

答案 0 :(得分:4)

perl警告或错误消息的含义的答案始于咨询perldoc perldiag,其中说:

  

(F)Perl试图编译一个包含“(?{的正则表达式              ...})“在运行时的零宽度断言,就像在运行时那样              pattern包含插值。因为那是一种安全              风险,是不允许的。如果你坚持,你仍然可以这样做              使用“re'eval'”pragma或显式构建模式              在运行时从插值字符串中使用并在              eval()函数。请参阅perlre中的“(?{code})”。

由于这是一个潜在的高度不安全的操作,可能直接运行作为用户输入输入的代码,您必须明确启用它。