7

如果我有一个.pm文件,有没有办法use在不把它放在我的@INC路径上的情况下呢?我认为这在我的特定用例中会更清晰 - 比使用相对路径或将此目录添加到@INC.

编辑:澄清:

我希望避免遍历 中的每个项目@INC,而是直接指定我感兴趣的文件。例如,在 Node.JS 中,require('something')将搜索路径列表,但require('/specific/something')会直接转到我告诉它的位置。

在 Perl 中,我不确定这是否与 中的功能相同require,但它似乎可以工作。

但是,use语句需要裸词。这让我对如何进入绝对路径感到有些困惑。

4

5 回答 5

6

你可以使用这个:

use lib '/path/to/Perl_module_dir'; # can be both relative or absolute
use my_own_lib;

您可以@INC自己修改(暂时不用担心,这也是这样use lib做的):

BEGIN{ @INC = ( '/path/to/Perl_module_dir', @INC ); } # relative or absolute too
use my_own_lib;
于 2013-02-13T13:40:00.677 回答
4

根据评论中的讨论,我建议使用require它自己。如下图,

require "pathto/module/Newmodule.pm";

Newmodule::firstSub();

您也可以使用以下其他选项

  • use lib 'pathto/module';需要将此行添加到您要在其中使用模块的每个文件中。

使用库“路径/模块”;
使用新模块;

  • 使用PERL5LIB环境变量。使用 export 在命令行上设置它或将其添加到,~/.bashrc以便每次登录时将其添加到您的@INC. 记住 PERL5LIB 在所有 @INC 目录之前添加目录。所以会先用。您也可以在 apache httpd.conf 中使用

    SetEnv PERL5LIB /fullpath/to/module
    
  • 或将其设置在 BEGIN 块中。

于 2013-02-14T15:03:45.970 回答
1

一般来说,设置PERL5LIB环境变量。

export PERL5LIB=/home/ikegami/perl/lib

如果要查找的模块打算安装在相对于脚本的目录中,请使用以下命令:

use FindBin qw( $RealBin );
use lib $RealBin;
  # or
use lib "$RealBin/lib";
  # or
use lib "$RealBin/../lib";

这将正确处理脚本的符号链接。

$ mkdir t

$ cat >t/a.pl
use FindBin qw( $RealBin );
use lib $RealBin;
use Module;

$ cat >t/Module.pm
package Module;
print "Module loaded\n";
1;

$ ln -s t/a.pl

$ perl a.pl
Module loaded
于 2013-02-13T20:49:20.637 回答
0

您可以使用Module::Load模块

use Module::Load;
load 'path/to/module.pm';
于 2013-02-13T14:28:46.127 回答
0

FindBin::libs可以解决问题:

# search up $FindBin::Bin looking for ./lib directories
# and "use lib" them.

use FindBin::libs;
于 2013-02-13T15:40:15.380 回答