使用/需要绝对路径?

问题描述 投票:0回答:5

如果我有一个

.pm
文件,有没有办法可以
use
它,而不将其放在我的
@INC
路径上?我认为这在我的特定用例中会更清晰 - 比使用相对路径或将此目录添加到
@INC
更清晰。

我希望避免遍历

@INC
中的每个项目,而是直接指定我感兴趣的文件。例如,在 Node.JS 中,
require('something')
将搜索路径列表,但是
require('/specific/something') 
会直接去我告诉它的地方。

在 Perl 中,我不确定这是否与

require
中的功能相同,但它似乎有效。

但是,

use
陈述需要裸词。这让我对如何输入绝对路径有点困惑。

perl absolute-path
5个回答
8
投票

你可以使用这个:

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;

3
投票

根据评论中的讨论,我建议使用

require
本身。就像下面这样,

require "pathto/module/Newmodule.pm";

Newmodule::firstSub();

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

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

使用 lib '路径/模块';
使用新模块;

  • 使用

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

    在 apache httpd.conf 中设置它
    SetEnv PERL5LIB /fullpath/to/module
    
  • 或者将其设置在BEGIN块中。


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

-1
投票

您可以使用 Module::Load 模块

use Module::Load;
load 'path/to/module.pm';

-1
投票

FindBin::libs 可以解决问题:

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

use FindBin::libs;
© www.soinside.com 2019 - 2024. All rights reserved.