如何从相对路径中获取我的Perl程序的绝对路径?

问题描述:

我需要找到的完整路径,我当前正在运行的Perl脚本,即如何从相对路径中获取我的Perl程序的绝对路径?

  • 的〜/ DIR/my.pl我需要它是“/ home/user中/ DIR /我特等”。 $0会给我“〜/ dir/my.pl”。

  • 为./my.pl我仍然需要 “/home/user/dir/my.pl”

等谢谢!

使用FindBin模块:

$ cat /tmp/foo/bar/baz/quux/prog 
#! /usr/bin/perl 

use FindBin; 

print "$FindBin::Bin/$FindBin::Script\n"; 

$ PATH=/tmp/foo/bar/baz/quux prog 
/tmp/foo/bar/baz/quux/prog 

$ cd /tmp/foo/bar/baz/quux 

$ ./prog 
/tmp/foo/bar/baz/quux/prog 
+0

是的,这是我需要的。谢谢 – 2009-06-23 16:19:18

看起来你只需要将路径展开为它们的绝对值。检查this article如何做到这一点。

+0

您不能将./my.pl扩展到任何东西,除非您知道拨打电话时的位置(即CWD) – 2009-06-23 16:17:56

+0

这也不处理波浪扩展。 – 2009-06-23 16:20:38

你应该看看FindBinFindBin::Real

使用FindBin模块

这听起来像你正在寻找的rel2abs function in File::Spec。例如:

#!/usr/bin/perl 

use File::Spec; 
my $location = File::Spec->rel2abs($0); 
print "$location\n"; 

这将在你所描述的方式解决$ 0:

$ ./myfile.pl 
/Users/myname/myfile.pl 
$ ~/myfile.pl 
/Users/myname/myfile.pl 

或者,你可以在使用方式不尽相同Cwd::abs_path

在文件本身是符号链接的情况下,上述许多概念都会中断。我通常以以下方式启动我的脚本:

use strict; 
use English; 
use warnings; 

use Cwd qw(realpath); 
use File::Basename; 
use lib &File::Basename::dirname(&Cwd::realpath($PROGRAM_NAME)); 

希望这会有所帮助。