【问题标题】:How can I tell perl the path for a module?如何告诉 perl 模块的路径?
【发布时间】:2011-06-05 19:51:59
【问题描述】:

我在我的 perl 脚本中使用了一个 perl 模块文件:

printtab.pl

use Table;

Table.pmprinttab.pl 存在于同一目录中,所以只要我从目录中执行 printtab,它就可以正常执行。

但如果我从其他地方执行它,例如,使用 cronjob,我会收到一条错误消息,指出在 @INC 中找不到该模块。

解决这个问题的正确方法是什么?

我试过了

push @INC, "/path/Table.pm";

但它不起作用。 你能告诉我为什么吗?

我发现了use lib,它工作正常

use lib "/path";

在这种情况下使用 lib 是不是最好的方法?

【问题讨论】:

  • 'use lib ..' 是最好的。您还可以在运行脚本之前设置 PERL5LIB 环境变量:perldoc.perl.org/perlrun.html 或使用 -I/path/ 开关运行 perl。
  • use FindBin qw($Bin); use lib $Bin; use lib "$Bin/../lib"; ???????? ????????? ????????????????????? ??????????????????

标签: perl perl-module


【解决方案1】:

use lib 是一个不错的选择。但是你是把你的模块和你的程序放在同一个目录中(或者放在一个相对于包含你的程序的目录中),你可以使用use FindBin;,比如:

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

【讨论】:

  • 这是正确答案。 'FindBin 正是为此而设计的。
【解决方案2】:
push @INC, "/path/Table.pm";

不起作用,因为@INC 应该是目录列表,而不是模块的完整路径。所以如果你这样做:

push @INC, "/path";

它应该可以工作。

话虽如此,use lib "/path"; 也是一个不错的选择。

根据您的程序的安装目录结构,使用 FindBin 确定脚本的实际位置可能有助于构建模块的正确路径。

【讨论】:

    【解决方案3】:

    一个巧妙的小技巧:

    #! /usr/bin/env perl
    
    use strict;
    use warnings;
    
    BEGIN {
        our $moduleIsMissing;
        eval {
            require My::Module;
        };
    
        if ($@) {
            $moduleIsMissing = 1;
        }
    }
    
    if ($main::moduleIsMissing) {
        print "Module is missing. I've got to do something about it!\n"
    }
    else {
        print "Module is there. I'm fine!\n";
    }
    

    我对 $main::moduleIsMissing 的事情不满意,但我还没有想出解决办法。

    如果My::Module 可用,则它已加载并且一切正常。否则,设置$main::moduleIsMissing 标志。这使您可以测试以查看模块是否已加载,如果没有,则采取规避措施。例如,如果模块Term::Cap 可用,您的程序将在打印文本时使用粗体,但如果没有,则将简单地打印出没有粗体的文本。


    回到问题:这样做要好得多:

    use lib "MyDir";
    

    而不是@INC

    use lib 包含编译时的目录。因此,如果我在目录“MyDir”中有一个模块“Foo::Bar”,我可以这样做:

    use lib qw(MyDir);
    use Foo::Bar;
    

    没有 Perl 抱怨。如果我这样做:

    push (@INC, qw(MyDir));
    use Foo::Bar;;
    

    Perl 会抱怨它找不到我的模块。

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      相关资源
      最近更新 更多