简体   繁体   中英

How can I get the absolute path of my Perl program from its relative path?

I need to find the full path to the Perl script I'm currently running, ie

  • for ~/dir/my.pl I would need it to be "/home/user/dir/my.pl". The $0 will give me "~/dir/my.pl".

  • for ./my.pl I would still need "/home/user/dir/my.pl"

etc. Thanks!

Use the FindBin module:

$ 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

It sounds like you're looking for the rel2abs function in File::Spec . For example:

#!/usr/bin/perl

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

This will resolve $0 in the way you describe:

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

Alternatively, you could use Cwd::abs_path in the exact same way.

你应该看看FindBinFindBin :: Real

Looks like you just need to expand the paths to their absolute values. Check this article for how to do that.

使用FindBin模块

Many of the concepts mentioned will break in case that the file itself is a symbolic link. I usually start my scripts in the following way:

use strict;
use English;
use warnings;

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

Hopefully this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM