Самый простой способ найти имя файла текущего исполняемого файла - с помощью FindBin :
use FindBin;
use File::Spec;
print "the directory of my script is: " . $FindBin::Bin . "\n";
print "the base name of my script is: " . $FindBin::Script . "\n";
print "the canonical location of my script is: " . File::Spec->catfile($FindBin::Bin, $FindBin::Script) . "\n";
Внутренне, вы можете получить часть этой информации, посмотрев $0
(имя скрипта, которое вызывается в командной строке), и __FILE__
, который является именем исполняемого в данный момент файла. (См. perldoc perlvar .)
Чтобы извлечь имя файла исполняемого в данный момент модуля , начните с изучения __PACKAGE__
, выполните магию подстановки, а затем найдите имя файла в %INC
:
(my $filename = __PACKAGE__ ) =~ s#::#/#g;
$filename .= '.pm';
my $abs_filename = $INC{$filename};
Я делаю это в одной из моих библиотек инициализации, чтобы найти скрипт конфигурации в пути относительно текущего модуля (у меня установлено несколько веток кода, расположенных рядом, каждая со слегка отличающимися конфигами):
# use the location of the current module as a guide for where to find configs
(my $filename = __PACKAGE__ ) =~ s#::#/#g;
$filename .= '.pm';
(my $path = $INC{$filename}) =~ s#/\Q$filename\E$##g; # strip / and filename
my $abs_config_file = File::Spec->catfile($path, $config_file);
MyApp->initialize($abs_config_file);