簡體   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