【问题标题】:How does Perl's lib pragma work?Perl 的 lib pragma 是如何工作的?
【发布时间】:2010-04-07 14:49:19
【问题描述】:

我使用use lib "./DIR" 从其他地方的文件夹中获取库。但是,它似乎无法在我的服务器上运行,但在我的本地桌面上运行良好。 有什么特别的原因吗?

还有一个问题,use lib 会在多个模块中传播吗?

两种情况: 假设我创建了一个需要几个库的基类,但我知道它需要扩展,并且扩展类需要使用另一个库。我可以将use lib 命令放在基类中吗?还是我需要把它放在每个扩展类中?

最后,我可以只拥有一个use package,其中包包含一堆 use lib,它会将 use lib 语句传播到我当前的模块吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

    use lib 语句中的. 表示“当前工作目录”,并且仅当您的脚本从正确的目录运行时才会起作用。服务器对 cwd 的想法可能是不同的(或未定义的)。假设库目录与脚本位于同一位置并且对它是私有的,那么您想要执行以下操作:

    use FindBin;
    use lib "$FindBin::Bin/DIR";
    

    use lib 语句会影响@INC——当你 userequire 一个模块时 perl 搜索的位置列表。它全局影响解释器的当前实例。您真的应该只将 use lib 语句放在脚本中,而不是模块中。

    原则上,在使用这些位置的任何包之前,您可以拥有一个由一堆 use lib 语句和 use MyLibs 组成的 package MyLibs,但我不推荐它。

    【讨论】:

    • 我使用 getcwd 找出“.”在哪里是。只是想知道是否有可能找出 perl 脚本的位置?当我尝试使用 FindBin 时它不起作用,因为 lib 和 bin 没有位于同一位置。所以这是我正在尝试做的一个例子。我从说 folder1 运行 perl 脚本。它使用了 lib "/abs/path/topack/";使用包。在包中我确实使用 lib './FOLDER2';假设 cwd 是相同的。自从 ”。”指向 Folder1,而不是路径。这是错误的。我如何不使用包中的绝对路径但也可以使用.?有可能吗?
    • @Tyug:您可以通过检查 %INC 来确定模块的加载位置。请参阅 stackoverflow.com/questions/1463414 了解类似的问题,该问题应该可以让您指出正确的方向。
    【解决方案2】:

    如果没有更多信息,就无法知道为什么它不能在您的服务器上运行。特别是,检查服务器的错误日志,如有必要,将@INC 转储到某处,并将其与您的实际库路径进行比较。

    use lib 修改了全局的@INC,因此只要在其他包尝试包含内容之前执行use lib,它就会起作用,并且所有其他包都会看到新的包含路径。

    有关@INC 的更多信息,请参阅perlvar 中的条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2013-04-10
      • 2017-01-14
      • 2012-06-16
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多