[英]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);
通過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__
)。
這是我通常用來獲取執行代碼路徑的片段。
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.