Perl旧代码defined(@array)与defined(%hash)废弃告警重构咨询
问题解答
Locale::Maketext代码改写正确性判断
你给出的改写完全正确,原因如下:
Perl中数组、哈希这类聚合类型直接放在布尔上下文时,会自动返回自身是否非空的布尔结果:空数组、空哈希返回false,存在至少一个元素则返回true,和原有代码中defined(@array)、defined(%hash)的实际执行效果完全一致,不会改变原有业务逻辑,同时可以消除废弃警告。
defined(@array)、defined(%hash)被废弃的背景
- 该用法的废弃通知从Perl 5.16版本开始公示,Perl 5.22版本正式运行时触发废弃警告,未来的Perl版本会直接将该用法判定为语法错误。
defined()函数的设计初衷仅用于判断标量类型是否为undef状态,早期版本允许将其作用于数组、哈希属于非标准的兼容实现,语义非常模糊:很多开发者会误以为该用法是判断「数组/哈希的符号是否存在」,但实际执行效果和直接在布尔上下文判断是否非空完全一致,没有额外的使用价值,反而容易造成理解歧义。- Perl官方为了统一
defined()的语义边界,因此废弃了将其作用于非标量类型的用法。
CGI.pm代码的正确改写
你自行改写的代码逻辑错误,原有第二个条件是判断$initializer未定义,你的写法改成了判断$initializer为真值,完全颠倒了逻辑。正确写法如下:
if (@QUERY_PARAM && !defined $initializer) {
逻辑说明:
@QUERY_PARAM直接在布尔上下文判断,等价于原有defined(@QUERY_PARAM)的效果,符合废弃用法的修改规范。$initializer是标量类型,defined()作用于标量属于官方支持的合法用法,不需要调整,直接保留!defined $initializer即可实现判断该变量不存在的逻辑。
内容的提问来源于stack exchange,提问作者shefulloflight
相关产品推荐
相关产品推荐

