in reply to Re^4: What script is this, and where is it? (Re: who am I?)
in thread who am I?

Ok, so, soon on CPAN (when I have time to write the PODs):
package File::ScriptName; use strict; use warnings; use version; our $VERSION = qv('0.1'); our $AUTHORITY = 'MASSA'; use Exporter q(import); our @EXPORT_OK = qw(myname mybase mydir); use Carp; use Cwd qw(realpath); use File::Spec::Functions qw(rel2abs); use File::Basename qw(basename dirname); BEGIN { my $myname = $0 = realpath rel2abs $0; my $mybase = basename $0, qw(.t .pm .pl .perl); my $mydir = dirname $0; croak 'chdir() used too early' unless -f $0; sub myname { $myname } sub mybase { $mybase } sub mydir { $mydir } } 1
Just use $0 (or File::ScriptName::myname) to find the real script name or use File::ScriptName::mybase and File::ScriptName::mydir for whatever purposes you want; traverses all symlinks and stuff... is it enough??
Update: croaks if you chdir before executing the module (possibly in a BEGIN block). Don't do that.

UpUpdate:It's on CPAN now, as scriptname...
[]s, HTH, Massa (κς,πμ,πλ)

Replies are listed 'Best First'.
Re^6: What script is this, and where is it? (Re: who am I?)
by ikegami (Patriarch) on Sep 25, 2008 at 01:02 UTC
    Awesome!

    rel2abs isn't needed.
    realpath rel2abs $0
    is the same as
    realpath $0

Re^6: What script is this, and where is it? (Re: who am I?)
by repellent (Priest) on Sep 25, 2008 at 02:55 UTC
    Is there a reason to croak anymore, now that realpath is used instead of rel2abs?
Re^6: What script is this, and where is it? (Re: who am I?)
by TGI (Parson) on Oct 01, 2008 at 21:53 UTC

    I just tried this code with an executable bound with PerlApp. The code as written works fine if the executable is called by "exename.exe". However, it dies if the executable is called by "exename".

    Here's my ugly modification to your code. There's probably a nicer way to do it. Clean it up as you desire.

    BEGIN { my $rel2abs = rel2abs $0; my $realpath = eval { realpath $rel2abs }; unless ( defined $realpath ) { warn "$rel2abs"; $rel2abs .= '.exe'; $realpath = realpath $rel2abs; } my $myname = $0 = $realpath; #my $myname = $0 = realpath rel2abs $0; my $mybase = basename $0, qw(.t .pm .pl .perl .exe); my $mydir = dirname $0; die 'chdir() used too early' unless -f $0; sub myname { $myname } sub mybase { $mybase } sub mydir { $mydir } }

    Thanks for the useful code. ++!.


    TGI says moo