HP-UX(hpia11.31)环境编译Perl 5.32.1出现正则计算失败问题咨询
问题根因
该问题是HP-UX老旧C编译器的优化bug导致,核心原因如下:
- 你使用的
HP C/aC++ B3910B A.06.20是2008年发布的老版本编译器,Perl 5.32.1的正则引擎引入了5.28版本没有的批量匹配优化逻辑,regexec.c中的正则匹配边界判断代码,会被编译器的+O2 +Onolimit优化等级错误处理,导致匹配终止条件失效,正则无法正确截取匹配段,直接返回全部输入内容。 - 该问题仅出现在HP-UX平台,是因为该平台编译器版本老旧,且Perl上游对HP-UX的适配维护从5.30版本开始已经逐步降级,没有针对老编译器的优化问题做兼容处理。
修复方案
你可以按照优先级尝试以下方案:
- 单独降低regexec.c的优化等级
正常执行Configure生成Makefile后,手动修改regexec.o的编译命令,将+O2 +Onolimit替换为+O1,仅对正则引擎文件关闭高阶优化,其余文件保持原编译参数不影响整体性能:
cc -c -DPERL_CORE -D_POSIX_C_SOURCE=199506L -D_REENTRANT \ -Ae -Wp,-H150000 -D_HPUX_SOURCE -Wl,+vnocompatwarnings +DD64 \ -D_INCLUDE__STDC_A1_SOURCE -I/usr/local/include -D_LARGEFILE_SOURCE \ -D_FILE_OFFSET_BITS=64 +O1 regexec.c
重新编译后即可验证正则功能是否恢复正常。
2. 调整栈大小限制
64位HP-UX 11.31默认栈大小上限较低,正则递归匹配可能触发栈越界导致逻辑异常,编译前执行以下命令调整栈限制后再启动编译:
ulimit -s unlimited
- 禁用正则trie优化
如果以上方案无效,可以在执行Configure时添加参数禁用Perl 5.30+新增的正则trie优化,完全兼容老版本编译器的逻辑:
./Configure -Accflags=-DPERL_NO_REGEXP_TRIE [其余原有配置参数]
重新生成Makefile后编译即可。
内容的提问来源于stack exchange,提问作者lthemick
相关产品推荐
相关产品推荐

