perl查询空表引起的bug
这篇文章详细复盘了阿里集团内部数据采集系统(xxagent)中,一个由Perl查询空表引发的诡异Bug。问题现象是:当数据库表(如lijie)中没有记录时,Perl脚本通过DB模块查询,得到的日志显示矛盾结果——直接打印查询结果数组显示为0条,但数组的标量上下文却报告存在1条记录,导致数据采集逻辑异常。 问题的根因出在DB模块的`query`函数实现上。当底层数据库查询返回0条记录时,函数并没有正确地返回一个空数组给调用方,反而因为`scalar @res`为假,错误地进入了重连和重试的逻辑循环,最终函数没有显式返回值,造成了调用方接收到的状态不一致。 修复方案很直接:在`query`函数的循环外添加一个明确的返回语句,确保在重试耗尽后,能返回一个预先定义好的空数组`@nores`。修改后,空表查询的行为得到修正,日志输出恢复为一致的`0`条记录,监控逻辑也随之正常。这个案例提醒我们,即使是一个简单的数据库查询封装,也必须对空结果集等边界情况做严谨的处理,否则可能埋下难以排查的隐患。