首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >autovivication.pm中的Perl编译错误

autovivication.pm中的Perl编译错误
EN

Stack Overflow用户
提问于 2015-12-04 16:09:19
回答 1查看 288关注 0票数 4

我使用的是一个perl cgi脚本,它使用我们自己的库,它使用的是“没有自动生动化”的实用化。例如。

/usr/lib/company/mysim.cgi:

代码语言:javascript
复制
#!/usr/bin/perl -w

use strict;
# ... other use
use Company::Module1;

/usr/lib/perl5 5/Company/Module下午1时

代码语言:javascript
复制
package Company::Module1;

no autovivification;
use strict;
use warnings;

大约有50%的时间,当访问URL以到达cgi脚本时,编译失败。

代码语言:javascript
复制
[Fri Dec 04 15:40:10.744901 2015] [:error] [pid 30455:tid 2961136448] Bareword "A_HINT_STRICT" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_WARN" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_FETCH" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_STORE" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_EXISTS" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_DELETE" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nCompilation failed in require at /usr/lib/company/mysim.cgi line 14.\nBEGIN failed--compilation aborted at /usr/lib/company/mysim.cgi line 14.\n

(取自/var/log/apache2/ssl/error.log,因为此脚本位于https端口上)。

我的环境是:- debian (8.2) - tomcat7 - apache2 (2.4) - perl 5.20.2 -libautovivification perl 0.12-1+b1

我的问题是:

  1. 有人见过这个吗?似乎奇怪的是,由于“使用严格”的语用,自动生动化模块无法编译。
  2. 有人能解释编译错误的间歇性吗?更奇怪的是,cgi没有编译一半的时间,并且运行良好(即运行并返回预期的结果)另一半。

耽误您时间,实在对不起。

2015年9月12日:一些补充资料.

谢谢大家的反馈。

线程没有显式的创建,尽管这是在apache的上下文中,因此可能需要线程处理请求。

根本原因似乎是XSLoader中的失败。至少这个极小的例子..。

代码语言:javascript
复制
package autovivification;

use 5.008_003;

use strict;
use warnings;

our $VERSION;
BEGIN {
 $VERSION = '0.12';
}

BEGIN {
 require XSLoader;
 XSLoader::load(__PACKAGE__, $VERSION);
}

my %bits = (
 strict => A_HINT_STRICT,
 warn   => A_HINT_WARN,
 fetch  => A_HINT_FETCH,
 store  => A_HINT_STORE,
 exists => A_HINT_EXISTS,
 delete => A_HINT_DELETE,
);

编译,而这个

代码语言:javascript
复制
package autovivification;

use 5.008_003;

use strict;
use warnings;

our $VERSION;
BEGIN {
 $VERSION = '0.12';
}

#BEGIN {
# require XSLoader;
# XSLoader::load(__PACKAGE__, $VERSION);
#}

my %bits = (
 strict => A_HINT_STRICT,
 warn   => A_HINT_WARN,
 fetch  => A_HINT_FETCH,
 store  => A_HINT_STORE,
 exists => A_HINT_EXISTS,
 delete => A_HINT_DELETE,
);

同样的错误失败。

所以,我要四处看看apache日志中的负载错误.在某个地方。

再次感谢你抽出时间。

16/12/2015:更新-固定

根本原因是mod_perl,以及Apache2.2和2.4之间(可能的)变化。脚本的apache配置在设置由ScriptAlias处理的URI /cgi之前发生,该配置为/cgi/ script提供了一个URI URI。在Apache2.2中,这种排序似乎很重要,脚本是而不是mod_perl处理的。但是,在Apache2.4中,排序似乎并不重要,脚本现在由mod_perl处理。

出现此错误是因为mod_perl没有(也从未打算)处理此脚本。修复方法是将脚本的URI更改为/somethingelse/script。

感谢大家的评论。

EN

回答 1

Stack Overflow用户

发布于 2017-08-16 11:37:09

根本原因是mod_perl,以及Apache2.2和2.4之间(可能的)变化。脚本的apache配置在设置由ScriptAlias处理的URI /cgi之前发生,该配置为/cgi/ script提供了一个URI URI。在Apache2.2中,这种排序似乎很重要,而且脚本不是由mod_perl处理的。但是,在Apache2.4中,排序似乎并不重要,脚本现在由mod_perl处理。

出现此错误是因为mod_perl没有(也从未打算)处理此脚本。修复方法是将脚本的URI更改为/somethingelse/script。- HalfOpenedEye

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34092559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档