当前位置:  开发笔记 > 编程语言 > 正文

在不使用require的情况下确定模块的绝对路径

如何解决《在不使用require的情况下确定模块的绝对路径》经验,为你挑选了2个好方法。

在某些情况下,您需要确定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的情况下确定模块的绝对路径名?



1> Håkon Hæglan..:

我将此解决方案发布到我自己的问题,因为我找不到这样做的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;
}


如果确实有效,请将其发布给CPAN!:)
你应该解释它的作用与Perl的作用之间的区别(`if!ref($ dir)`).

2> Borodin..:

Module::Util模块提供了find_installed我认为您需要的功能.

还有面向对象Module::InfoModule::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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有