如果我在某些庫代碼中,如何確定當前正在執行的代碼文件的路徑?我知道如何通過查看ARGV
得到頂級 perl文件的路徑,但是如果我加載一個庫,那麼庫如何知道它位於哪個路徑?在Perl中,如何獲取當前正在執行的代碼的目錄或路徑?
回答
__FILE__
令牌會爲您提供包括文件名的完整路徑。您可以使用File::Spec將其分割成組件:
my ($volume, $directory, $file) = File::Spec->splitpath(__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__
)。
找到文件名當期可執行的最簡單的方法是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 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以獲取更多指導。
稍微更通用的寫作方法相同: 使用Cwd qw/abs_path /; (my $ script_path = abs_path($ 0))=〜s | ^(。*)([\/\\])(。*)| $ 1 $ 2 | g; – 2014-08-20 10:03:38
最簡單的方法:
print $ENV{'PWD'};
不幸的是,這是行不通的。如果我從/ home/luser執行'/ foo/bar/baz',那麼'$ ENV {PWD}'將返回'/ home/luser /'而不是'/ foo/bar'。 – 2014-06-20 15:16:59
歡迎來到SO。您的答案可能會也可能不會是正確的,但無論哪種方式,我們都會鼓勵人們解釋他們的答案,而不僅僅是發佈代碼片段。 – 2014-06-20 15:48:11
PWD它是bash(也許其他shell)env autoset變量。當某個進程改變目錄並調用你的腳本時,PWD指向前一個目錄,而不是當前目錄。更好地移除這個答案,防止丟失點:) – Znik 2014-10-17 13:29:48
- 1. 如何獲取當前正在執行的javascript代碼的文件路徑
- 2. 如何在CSI中獲取當前正在執行的腳本的路徑或目錄?
- 3. 在Perl中獲取當前工作目錄路徑
- 4. 如何獲取當前正在執行的代碼的HMODULE?
- 5. 獲取正在執行的.app文件的當前路徑
- 6. 如何僅獲取當前可執行文件路徑的目錄部分?
- 7. 如何從Groovy中的完整路徑獲取當前目錄?
- 8. Ruby:獲取定義當前正在執行的代碼的類
- 9. 如何在AngularJS中獲取當前路徑的路徑名?
- 10. 如何在顫動中獲取當前的路徑路徑?
- 11. 如何在Python中獲取項目的當前路徑?
- 12. 在函數中獲取當前目錄,而不是路徑.bashrc
- 13. 如何在Python中獲取當前文件目錄的完整路徑?
- 14. 如何在Objective-C中獲取當前工作目錄的絕對路徑?
- 15. 如何在Windows中獲取Python2.7當前目錄的完整路徑?
- 16. 獲取正在運行的java文件的當前路徑
- 17. 如何獲得路徑正在執行
- 18. 如何在VB中獲取當前可執行文件的完整路徑?
- 19. 獲取當前目錄路徑或名稱程序集8086
- 20. 如何獲取正在執行的凍結腳本的路徑
- 21. 獲取正在運行的進程的目錄路徑ID
- 22. 如何獲取當前html的路徑?
- 23. 從當前目錄中獲取三級PHP文件的路徑
- 24. 無法獲取Python中的當前目錄路徑(Linux)
- 25. 在Ruby中獲取當前代碼行
- 26. 如何在Linux中使用java命令獲取當前正在執行的jar包的空間路徑?
- 27. 如何使用Javascript獲取當前正在運行的腳本的路徑?
- 28. OCaml:如何獲取當前模塊的路徑* /我的項目目錄?
- 29. 在ApplicationRoute中獲取當前路徑
- 30. 獲得相對路徑的絕對路徑當前目錄
我認爲這將不能正確處理相對路徑。 – 2010-03-08 17:59:30
@Leon:這取決於你的意思是「正確」。 '__FILE__'的值應該與'%INC'中的值相匹配。如果您已將相對路徑添加到'@ INC',那麼您可能會返回相對路徑。 'splitpath()'會處理那個,但是目錄部分將是相對的,而不是絕對的。如果這是一個問題,你可以使用File :: Spec-> rel2abs()將一個(可能)相對路徑轉換爲絕對路徑。 – 2010-03-08 19:53:12
當然'__FILE__'實際上可能不是文件。嘗試在文件中的某處出現'#line 42 foo.bar'後運行'warn __FILE__'。 – jrockway 2010-03-09 15:33:20