3

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

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

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

等谢谢!

4

6 回答 6

6

使用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
于 2009-06-23T16:11:03.987 回答
5

听起来您正在寻找File::Spec 中的 rel2abs 函数。例如:

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

于 2009-06-23T16:14:42.833 回答
2

你应该看看FindBinFindBin::Real

于 2009-06-23T16:01:20.973 回答
1

看起来您只需要将路径扩展到它们的绝对值。查看这篇文章以了解如何做到这一点。

于 2009-06-23T15:54:28.537 回答
0

使用 FindBin 模块

于 2009-06-23T16:12:11.790 回答
0

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

use strict;
use English;
use warnings;

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

希望这会有所帮助。

于 2012-02-10T17:27:53.543 回答