在某些情况下,您需要确定Perl模块的绝对路径名,但不需要加载Perl模块:
use strict; use warnings; my $mod_name = 'My::Module'; my $abs_path = mod_name_to_abs_path( $mod_name ); sub mod_name_to_abs_path { my ( $mod_name ) = @_; my $rel_fn = $mod_name =~ s{::}{/}gr; $rel_fn .= '.pm'; require $rel_fn; return $INC{$rel_fn}; }
上面的代码加载模块(with require
).
如何在不使用require的情况下确定模块的绝对路径名?
我将此解决方案发布到我自己的问题,因为我找不到这样做的CPAN模块.
use strict; use warnings; use File::Spec; my $mod_name = 'My::Module'; my $abs_path = mod_name_to_abs_path( $mod_name ); sub mod_name_to_abs_path { my ( $mod_name ) = @_; my $rel_fn = $mod_name =~ s{::}{/}gr; $rel_fn .= '.pm'; my $abs_path; for my $dir (@INC) { if ( !ref( $dir ) ) { my $temp = File::Spec->catfile( $dir, $rel_fn ); if ( -e $temp ) { if ( ! ( -d _ || -b _ ) ) { $abs_path = $temp; last; } } } } return $abs_path; }
该Module::Util
模块提供了find_installed
我认为您需要的功能.
还有面向对象Module::Info
和Module::Data
模块,它们将做一些表面上相似的事情
该程序显示了所有这三个的使用
use strict; use warnings 'all'; use feature 'say'; use Module::Util 'find_installed'; use Module::Info (); use Module::Data (); say find_installed('Module::Util'); say Module::Info->new_from_module('Module::Info')->file; say Module::Data->new('Module::Data')->path;
C:\Strawberry\perl\site\lib\Module\Util.pm C:\Strawberry\perl\site\lib\Module\Info.pm C:\Strawberry\perl\site\lib\Module\Data.pm