繁体   English   中英

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

[英]In Perl, how do I get the directory or path of the current executing code?

如果我在某些库代码中,如何确定当前正在执行的代码文件的路径? 我知道如何通过查看ARGV来获取顶级 perl文件的路径,但是如果我加载一个库,那么该如何知道它所在的路径?

__FILE__标记将为您提供包含文件名的完整路径。 您可以使用File :: Spec将其拆分为组件:

my ($volume, $directory, $file) = File::Spec->splitpath(__FILE__);

查找当前可执行文件文件名的最简单方法是使用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);

通过userequire包含的任何库都会在特殊的%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__ )。

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

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

这将实际目录路径放入$ real_path。 我通常也会在此之后执行chdir $real_path ,以确保我的代码实际上是在应该的目录之外(通常在我使用Win32 :: Daemon编写Windows服务时)。

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

我建议在Cpan上查看Cwd以获得更多指导。

最简单的方法:

print $ENV{'PWD'};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM