代码之家  ›  专栏  ›  技术社区  ›  Ross Rogers

在Perl中,如何获取当前执行代码的目录或路径?

  •  12
  • Ross Rogers  · 技术社区  · 14 年前

    如果我在某个库代码中,如何确定当前正在执行的代码的文件路径?我知道怎么走 顶部 通过查看Perl文件 ARGV 但是如果我加载一个库,怎么可能 图书馆 知道它在哪条路上?

    5 回复  |  直到 7 年前
        1
  •  17
  •   Michael Carman    14 年前

    这个 __FILE__ 令牌将为您提供包括文件名在内的完整路径。你可以用 File::Spec 要将其拆分为组件:

    my ($volume, $directory, $file) = File::Spec->splitpath(__FILE__);
    
        2
  •  13
  •   Ether    14 年前

    找到 当前可执行文件的文件名 FindBin :

    use FindBin;
    use File::Spec;
    
    print "the directory of my script is: " . $FindBin::Bin . "\n";
    print "the base name of my script is: " . $FindBin::Script . "\n";
    print "the canonical location of my script is: " . File::Spec->catfile($FindBin::Bin, $FindBin::Script) . "\n";
    

    在内部,您可以通过查看 $0 (在命令行中调用的脚本名称),以及 __FILE__ ,它是当前正在执行的文件的名称。(见 perldoc perlvar )

    提取 当前执行模块的文件名 ,从检查开始 __PACKAGE__ ,执行一些替换魔法,然后在中查找文件名 %INC :

    (my $filename = __PACKAGE__ ) =~ s#::#/#g;
    $filename .= '.pm';
    my $abs_filename = $INC{$filename};
    

    我在其中一个初始化库中执行此操作,以在相对于当前模块的路径中查找配置脚本(我有几个代码分支并排安装,每个分支的配置略有不同):

    # use the location of the current module as a guide for where to find configs
    (my $filename = __PACKAGE__ ) =~ s#::#/#g;
    $filename .= '.pm';
    
    (my $path = $INC{$filename}) =~ s#/\Q$filename\E$##g; # strip / and filename
    my $abs_config_file = File::Spec->catfile($path, $config_file);
    MyApp->initialize($abs_config_file);
    
        3
  •  1
  •   friedo    14 年前

    包括任何图书馆通过 use require 在特别节目中制作一个条目 %INC 搞砸。(见 perlvar )

    例如:

    use strict;
    use warnings;
    
    use Data::Dumper;
    
    print Dumper \%INC;
    

    这将产生类似于以下内容的输出:

    $VAR1 = {
          'warnings/register.pm' => '/usr/lib/perl5/5.8.8/warnings/register.pm',
          'bytes.pm' => '/usr/lib/perl5/5.8.8/bytes.pm',
          'XSLoader.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/XSLoader.pm',
          'Carp.pm' => '/usr/lib/perl5/5.8.8/Carp.pm',
          'Exporter.pm' => '/usr/lib/perl5/5.8.8/Exporter.pm',
          'strict.pm' => '/usr/lib/perl5/5.8.8/strict.pm',
          'warnings.pm' => '/usr/lib/perl5/5.8.8/warnings.pm',
          'overload.pm' => '/usr/lib/perl5/5.8.8/overload.pm',
          'Data/Dumper.pm' => '/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/Data/Dumper.pm'
        };
    

    此外,还有一个通用的 __FILE__ 将返回当前文件名的常量。(另请参见 __PACKAGE__ )

        4
  •  1
  •   Weegee    14 年前

    这是我通常用来获取执行代码路径的代码片段。

    use Cwd qw/abs_path/;
    my ($real_path) = abs_path($0) =~ m/(.*)myscript.pl/i;
    

    这会将实际目录路径放入$real_路径。我通常也表演 chdir $real_path 在这之后,为了确保我的代码实际在目录之外运行(通常在我使用win32::daemon编写Windows服务时)。

    这个 abs_path 我导出的子例程给出了作为参数提供的任何文件(名称/句柄)的路径。在这种情况下,我已经提供了 $0 这是正在执行的Perl脚本的名称。

    我建议退房 Cwd 关于CPAN的更多指导。

        5
  •  -4
  •   cxw    7 年前

    最简单的方法:

    print $ENV{'PWD'};