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

如何从Perl程序的相对路径中获取其绝对路径?,perl,relative-path,Perl,Relative Path,我需要找到当前运行的Perl脚本的完整路径,即 对于~/dir/my.pl,我需要它是“/home/user/dir/my.pl”。$0将给我“~/dir/my.pl” 对于./my.pl,我仍然需要“/home/user/dir/my.pl” 等等,谢谢 看起来您只需要将路径扩展到它们的绝对值。检查如何执行此操作。您应该查看或。使用模块: 使用FindBin模块听起来您正在寻找新的。例如: #!/usr/bin/perl use File::Spec; my $location = Fi

我需要找到当前运行的Perl脚本的完整路径,即

  • 对于~/dir/my.pl,我需要它是“/home/user/dir/my.pl”。
    $0
    将给我“~/dir/my.pl”

  • 对于./my.pl,我仍然需要“/home/user/dir/my.pl”


等等,谢谢

看起来您只需要将路径扩展到它们的绝对值。检查如何执行此操作。

您应该查看或。

使用模块:


使用FindBin模块

听起来您正在寻找新的。例如:

#!/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

或者,您也可以使用完全相同的方法。

如果文件本身是符号链接,则所提到的许多概念都会中断。我通常以以下方式启动脚本:

use strict;
use English;
use warnings;

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

希望这能有所帮助。

除非你知道打电话时你在哪里(即CWD),否则你不能将/my.pl扩展到任何地方。这也不能处理tilde扩展。看起来它给了我空的$FindBin::Bin,你是如何运行你的程序的?只是/my.pl,它已经#/itFindBin中的usr/bin/perl有已知的问题(),那么您是否遇到了其中的一个问题?FindBin有问题,如果您有~/bin/script.pl->~/scripts/script.pl,那么在执行script.pl$FindBin::bin后包含~/bin而不是~/scripts/。对于脚本的实际父目录,需要使用&File::Basename::dirname($Cwd::realpath($0))。不幸的是,不会。这意味着您与通话时所在的目录相同。可能是,也可能不是。。。不,不是…?“$导出路径=~/;cd/tmp/;myfile.pl'->/Users/myname/myfile.plI意味着myfile.pl作为一个复杂的程序,可能在调用它之后但在它尝试解析路径之前就已经被删除了。然后,如果调用为./myfile.pl,它将解析为/newdir/myfile.pl
use strict;
use English;
use warnings;

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