Question

I need to find the full path to the Perl script I'm currently running, i.e.

  • 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!

Was it helpful?

Solution

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

OTHER TIPS

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.

You should take a look at FindBin or FindBin::Real.

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

Use FindBin Module

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top