这次我有最新的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/'
答案 0 :(得分:4)
perl警告或错误消息的含义的答案始于咨询perldoc perldiag,其中说:
(F)Perl试图编译一个包含“(?{的正则表达式 ...})“在运行时的零宽度断言,就像在运行时那样 pattern包含插值。因为那是一种安全 风险,是不允许的。如果你坚持,你仍然可以这样做 使用“re'eval'”pragma或显式构建模式 在运行时从插值字符串中使用并在 eval()函数。请参阅perlre中的“(?{code})”。
由于这是一个潜在的高度不安全的操作,可能直接运行作为用户输入输入的代码,您必须明确启用它。