什么可以使Class :: Loader失败“使用”和“新”没有?

时间:2009-01-14 15:59:10

标签: perl cgi cpan

我正在使用一个使用Crypt::RSA的非常大的CGI应用程序,该应用程序已正确安装。当我尝试运行任何嵌入式库时,我得到“尝试将空引用作为函数调用”类型的错误(我现在无法返回以获取确切的错误,因为我们必须回滚发布日期) 。我跟踪Crypt :: RSA的构造函数的null引用,它使用Class::Loader来启用Crypt :: RSA :: ES :: OAEP。

我用“use”和“new”替换了类加载器,并且该部分工作正常,尽管库在许多方面仍然失败。显然我的环境出了问题。我只是不确定是什么。任何人都可以给我任何线索吗?

1 个答案:

答案 0 :(得分:2)

好的,经过12个小时的挖掘,我得到了这个工作。

这是发生了什么(但不是为什么)。每当我在引用的eval()use语句上调用require时(如在Class :: Loader中,以及在Crypt :: framwork中的其他位置),它都无法看到路径否则包含在Perl类路径中。由于大多数引用的use / require对象只是假设类将存在,所以很少有用的错误被抛弃。我会将@INC转储到eval块之外的文件中,一切都会存在。

具有讽刺意味的是,我在dev vs staging中使用了相同的设置,它在dev中工作,但在staging中没有。我还必须指出FindBin(我不应该在CGI中使用它,我知道,但是Crypt使用它)在staging中上下左右/ dev / null,但是没有在开发中。

由于我不能轻易地比较版本或全局配置,这就是我的任务结束的地方。

我如何在Crypt :: RSA中为自己解决问题是禁用与FindBin绑定的所有命令,并为我的代码可以访问的任何内容硬编码requir e引用。我在Crypt :: RSA中为Crypt :: RSA :: ES :: OAEP做了一个要求,在Crypt :: Random :: Generator for Crypt :: Random :: Provider :: rand

中做了一个

希望这可以帮助将来遇到问题的人。任何人都可以提出原因,请回复,我会添加它以完成帖子。