/tmp/perlmonks>cat run.pl
#!/usr/bin/perl
use strict;
use warnings;
use lib '/tmp/perlmonks';
# Tons of work omitted ... ;-)
@ARGV and chdir '/tmp/unrelated';
require Mod;
Mod::where();
/tmp/perlmonks>cat Mod.pm
package Mod;
use v5.12; # for say
use strict;
use warnings;
use FindBin;
sub where
{
say "Script is in $FindBin::Bin";
say "Script basename is $FindBin::Script";
say "Real script directory is $FindBin::RealBin";
say "Real script basename is $FindBin::RealScript";
say "Module was loaded from $INC{'Mod.pm'}";
}
1;
/tmp/perlmonks>perl run.pl
Script is in /tmp/perlmonks
Script basename is run.pl
Real script directory is /tmp/perlmonks
Real script basename is run.pl
Module was loaded from /tmp/perlmonks/Mod.pm
/tmp/perlmonks>
####
/tmp/perlmonks>perl -MMod -e Mod::where
Script is in /tmp/perlmonks
Script basename is -e
Real script directory is /tmp/perlmonks
Real script basename is -e
Module was loaded from Mod.pm
/tmp/perlmonks>
####
/tmp/perlmonks>perl run.pl x
Cannot find current script 'run.pl' at /usr/share/perl5/FindBin.pm line 166.
BEGIN failed--compilation aborted at /usr/share/perl5/FindBin.pm line 166.
Compilation failed in require at /tmp/perlmonks/Mod.pm line 6.
BEGIN failed--compilation aborted at /tmp/perlmonks/Mod.pm line 6.
Compilation failed in require at run.pl line 11.
/tmp/perlmonks>
####
/tmp/perlmonks>touch /tmp/unrelated/run.pl
/tmp/perlmonks>perl run.pl
Script is in /tmp/unrelated
Script basename is run.pl
Real script directory is /tmp/unrelated
Real script basename is run.pl
Module was loaded from /tmp/perlmonks/Mod.pm
/tmp/perlmonks>
####
/tmp/perlmonks>perl -MFindBin run.pl x
Script is in /tmp/perlmonks
Script basename is run.pl
Real script directory is /tmp/perlmonks
Real script basename is run.pl
Module was loaded from /tmp/perlmonks/Mod.pm
/tmp/perlmonks>