【问题标题】:Are keys and values of %INC platform-dependent or not?%INC 的键和值是否依赖于平台?
【发布时间】:2010-02-23 14:15:31
【问题描述】:

我想获取包含模块的完整文件名。考虑这段代码:

package MyTest;

my $path = join '/', split /::/, __PACKAGE__;
$path .= ".pm";

print "$INC{$path}\n";

1;

$ perl -Ipath/to/module -MMyTest -e0
path/to/module/MyTest.pm

它可以在所有平台上运行吗?

perlvar

哈希 %INC 包含以下条目 通过do 包含的每个文件名, requireuse运营商。钥匙 是您指定的文件名(与 模块名称转换为路径名), 并且值是 找到文件。

这些键是否依赖于平台?我应该使用File::Spec 还是什么?至少 Win32 上的 ActivePerl 使用 / 而不是 \

更新:%INC 值呢?它们是否依赖于平台?

【问题讨论】:

  • 你想对路径做什么?请提供更多背景信息!
  • 说,我想从那里包含更多模块。

标签: perl cross-platform perlvar


【解决方案1】:

鉴于它是一个标准模块,请使用Module::Loaded 的方法:

sub is_loaded (*) { 
    my $pm      = shift;
    my $file    = __PACKAGE__->_pm_to_file( $pm ) or return;

    return $INC{$file} if exists $INC{$file};

    return;
}

sub _pm_to_file {
    my $pkg = shift;
    my $pm  = shift or return;

    my $file = join '/', split '::', $pm;
    $file .= '.pm';

    return $file;
}

【讨论】:

  • 其实这和我写的代码是一样的。看来,这个模块适用于大多数平台。谢谢你。 cpantesters.org/distro/M/Module-Loaded.html#Module-Loaded-0.06 你能谈谈%INC 值的可移植性吗?
  • @codeholic 您想到哪些平台?请记住,/ 是 Win32 上的有效路径分隔符,并且比令人讨厌的双反击更好看。不要让 Windows 命令 shell 的 geb0rken interface 误导您。
  • 我想尽可能地制作跨平台代码,因为我期待最终将它发布在 CPAN 上。
  • / 不是 VMS 上的有效分隔符(至少在操作系统级别 - Perl 可以处理这些并转换为操作系统格式)。
【解决方案2】:

这是一个相当健壮的实现,也适用于尚未加载的模块。

use File::Find;
use File::Spec;

sub pkg2path (*) {
    my $file = join '[\\\/:]' =>
               map  "\Q$_"    =>
               split /::|'/   => "$_[0].pm";            # '

    /$file$/ and return File::Spec->rel2abs( $INC{$_} )
        for keys %INC;

    # omit the rest to only find loaded modules

    my $path; find {
        no_chdir => 1,
        wanted   => sub {
            $path = $_ and goto found if /$file$/
        }
    } => @INC;

    found: File::Spec->rel2abs($path or return)
}

say pkg2path Benchmark;
say pkg2path Devel::Trace;

【讨论】:

  • 同样的代码在Module::Find中写得更好。但它没有回答我的问题。
  • pkg2path 的第一行有你的答案。不,相信 %INC 中的条目将具有特定模式是不安全的(如果只是因为 %INC 是用户可写的)。这就是我编写正则表达式构建器的原因(在 Module::Find 中找不到它,它甚至不使用 %INC btw)。很高兴知道您感谢少数花时间思考和回答您的问题的人
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
相关资源
最近更新 更多