如何解决Perl中eval()执行触发'Bareword found'报错的问题
问题原因
Perl 绑定操作符 =~ 右侧默认需要接收正则表达式、匹配操作等可执行结构,你直接将未包裹 // 的正则裸字符串拼接进 eval 执行代码,Perl 会将 in 识别为未定义的裸词,从而抛出对应语法错误。
方案1:捕获eval错误直接返回0
eval 执行代码发生语法或运行时错误时,会自动将错误信息存入 Perl 内置变量 $@,你只需要在执行 eval 后检查该变量即可实现报错时返回0的需求,示例代码如下:
$val = 0; $name = "abc"; $user_pattern = 'in.*,out ['; # 来自用户输入的正则部分 $myStr = '$val = ($name =~ /' . $user_pattern . '/)'; eval($myStr); # 检查eval是否执行出错 if ($@) { $val = 0; }
如果你的需求就是不管什么原因eval报错就返回0,也可以直接简写为:
$val = eval($myStr) || 0;
注意:该写法会将eval返回空、false等情况也统一处理为0,可根据你的业务逻辑调整
方案2:规避eval的更安全实现
直接将用户输入拼接进eval存在极高的代码注入风险,若你的核心需求仅为用用户输入的正则匹配字符串,完全可以用qr//预编译正则,不需要用到eval:
$val = 0; $name = "abc"; $user_pattern = 'in.*,out ['; # 编译正则的同时捕获正则语法错误 eval { $re = qr/$user_pattern/; $val = ($name =~ $re) ? 1 : 0; }; if ($@) { $val = 0; }
该方案只会编译用户输入的正则内容,不会执行任意代码,安全性远高于直接拼接字符串进eval。
内容的提问来源于stack exchange,提问作者yasara malshan
相关产品推荐
相关产品推荐

