Perl 什么会使Class::Loader在哪里失败;使用「;及;新";不?

Perl 什么会使Class::Loader在哪里失败;使用「;及;新";不?,perl,cgi,cpan,Perl,Cgi,Cpan,我正在开发一个非常大的CGI应用程序,它使用的是正确安装的。当我尝试运行任何嵌入式库时,我遇到了一个“试图将空引用作为函数调用”类型的错误(我现在无法返回以获取确切的错误,因为我们必须回滚到发布日期)。我跟踪对Crypt::RSA的构造函数的null引用,该构造函数用于启用Crypt::RSA::ES::OAEP 我用一个“use”和一个“new”替换了类加载器,虽然库在很多方面仍然失败,但这部分工作正常。显然我的环境有问题。我只是不确定是什么。谁能给我一些线索吗?好的,经过12个小时的研究,我

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


我用一个“use”和一个“new”替换了类加载器,虽然库在很多方面仍然失败,但这部分工作正常。显然我的环境有问题。我只是不确定是什么。谁能给我一些线索吗?

好的,经过12个小时的研究,我终于找到了答案

下面是发生的事情(但不是原因)。每当我在引用的
use
require
语句上调用
eval()
(在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做了一个require,在Crypt::Random::Generator中为Crypt::Random::Provider::rand做了一个require


希望这能帮助将来有问题的人。任何人如果能提出原因,请回答,我会将其添加到文章中。

您是否尝试过运行针对Crypt::RSA的测试?是的,它们都非常成功。您在开发环境和服务器环境中都会遇到此错误吗?不,只是过渡。在这一点上,我已经为自己解决了这个问题,尽管不是它的根本原因。我将发布我是如何解决它的,以供将来参考。我不介意有人发现它背后的全部事实。是否有一个特定的评估,即使用/需要?你能用Data::Dumper在eval{}内外干掉\@INC吗?我现在没有完全的源代码访问权限,因为它在这里工作,为此我把我的项目插入了一个同事。我会制作一个手工制作的例子,但我可能无法复制这些条件。不过,我特别注意到了:eval(“require$module”);类中::装入器。