代码之家  ›  专栏  ›  技术社区  ›  user54650

什么可以使类::加载器在“use”和“new”不存在的情况下失败?

  •  3
  • user54650  · 技术社区  · 16 年前

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

    我用“use”和“new”替换了类装入器,这个部分工作得很好,尽管库在很多方面仍然失败。显然我的环境有问题。我只是不确定是什么。有人能给我任何线索吗?

    1 回复  |  直到 16 年前
        1
  •  2
  •   brian d foy    16 年前

    好吧,12个小时的调查之后,我开始工作了。

    这是发生的事情(但不是为什么)。每次我打电话 eval() 引用 use require 语句(在class::loader中,也在crypt::framwork中的其他位置)无法看到以其他方式包含为perl类路径的路径。由于大多数引用的use/require对象只是假设类在那里,所以很少有有用的错误被抛出给我。我会倾倒 @INC 归档,在一个eval块外,所有东西都会在那里。

    讽刺的是,我在dev和staging中使用了相同的设置,它在dev中工作,但在staging中不工作。我还必须指出,findbin(我不应该在cgi中使用它,我知道,但crypt使用它)在分段中上下摆动大约/dev/null,但在开发中没有。

    因为我不容易比较版本或全球配置,所以我的任务就到此结束。

    在crypt::rsa中,我是如何解决这个问题的:禁用所有绑定到findbin的命令和硬代码 requir e我的代码将访问的任何内容的引用。我在crypt::rsa中对crypt::rsa::es::oaep有一个要求,在crypt::random::generator中对crypt::random::provider::rand有一个要求。

    希望这能帮助将来有问题的人。任何能提出原因的人,请回答,我会添加它来完成这篇文章。