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

如何在Perl中加载相对于脚本位置的库?

  •  0
  • sorin  · 技术社区  · 14 年前

    如何在Perl中获得当前的脚本目录?

    require ).

    这不是当前目录

    例子:

    #/aaa/foo.pl
    require "../bbb/foo.pl"
    
    #/bbb/bar.pl
    # I want to obtain my directory (`/bbb/`)
    print($mydir)
    

    剧本 foo.pl perl /aaa/foo.pl ,或 ./foo.pl .

    6 回复  |  直到 14 年前
        1
  •  4
  •   rafl    14 年前

    use FindBin '$Bin';
    

    然后使用 $Bin 作为运行脚本的基目录。但是,如果你这样做的话,这是行不通的

    do '/some/other/file.pl';
    

    然后期待 $Bin位 包含 /some/other/ do 以及类似的构造。例如,模块。

    这些人通常不应该关心他们是从哪个目录加载的。如果他们真的需要在某条路径上操作,你可以将该路径传递给他们。

        2
  •  2
  •   AndyG    8 年前

    看到了吗 Dir::Self 伪常量 __DIR__ 恭维 __FILE__ & __LINE__ .

    use Dir::Self;
    
    use lib __DIR__ . '/lib'; 
    
        3
  •  1
  •   Jonathan Swartz    14 年前

    我经常使用这个片段:

       use Cwd qw(realpath);
       use File::Basename;
    
       my $cwd = dirname(realpath($0));
    

        4
  •  1
  •   sorin    14 年前

    在下面的示例中,添加 lib 包含路径的目录 $dirname require 从另一个目录。

    BEGIN {
       use File::Spec;
       use File::Basename;
       $dirname = dirname(File::Spec->rel2abs( __FILE__ )) . "/lib/";
    }
    use lib $dirname;
    
        5
  •  1
  •   brian d foy    14 年前

    perlfaq8 How do I add the directory my program lives in to the module/library search path?


    如果你已经知道这个目录,你可以把它添加到@INC,就像你对其他目录一样。如果您在编译时知道目录,您可能会:

    use lib $directory;
    

    这个任务的诀窍是找到目录。在脚本执行任何其他操作(如chdir)之前,您可以使用Perl附带的Cwd模块获取当前工作目录:

    BEGIN {
        use Cwd;
        our $directory = cwd;
        }
    
    use lib $directory;
    

    您可以使用值$0执行类似的操作,该值包含脚本名称。这可能有一个相对路径,但rel2abs可以将其转换为绝对路径。一旦你有了

    BEGIN {
        use File::Spec::Functions qw(rel2abs);
        use File::Basename qw(dirname);
    
        my $path   = rel2abs( $0 );
        our $directory = dirname( $path );
        }
    
    use lib $directory;
    

    Perl附带的FindBin模块可能可以工作。它会找到当前正在运行的脚本的目录并将其放入$Bin中,然后您可以使用它来构造正确的库路径:

    use FindBin qw($Bin);
    

    您也可以使用local::lib来做很多相同的事情。使用local::lib的设置安装模块,然后在程序中使用该模块:

     use local::lib; # sets up a local lib at ~/perl5
    

    有关详细信息,请参阅local::lib文档。

        6
  •  0
  •   Axeman maxelost    14 年前

    script.pl . 您可能正在运行它,或者您可能已经包含了它。你不知道。所以它要么在 %INC $PROGRAM_NAME (又名 $0

    use strict;
    use warnings;
    use English qw<$PROGRAM_NAME>;    
    use File::Basename qw<dirname>;
    use File::Spec;
    use List::Util qw<first>;
    
    # Here we get the first entry that ends with 'script.pl'
    my $key  = first { defined && m/\bscript\.pl$/ } keys %INC, $PROGRAM_NAME;
    die "Could not find script.pl!" unless $key;
    # Here we get the absolute path of the indicated path.
    print File::Spec->rel2abs( dirname( $INC{ $key } || $key )), "\n";
    

    链接到 File::Basename , File::Spec ,和 List::Util