gpt4 book ai didi

perl - 从 CPAN dist 文件中获取 "defined"模块?

转载 作者:行者123 更新时间:2023-12-01 01:06:37 26 4
gpt4 key购买 nike

给定一个 CPAN dist 文件(例如 Acme-Chef-1.01.tar.gz ),确定在 dist 文件中“定义”(或存在)哪些模块版本的算法是什么?

例如,在 02packages.details.txt文件,有四行对应于这个 dist 文件:

Acme::Chef                         1.01  S/SM/SMUELLER/Acme-Chef-1.01.tar.gz
Acme::Chef::Container 1.00 S/SM/SMUELLER/Acme-Chef-1.01.tar.gz
Acme::Chef::Ingredient 1.00 S/SM/SMUELLER/Acme-Chef-1.01.tar.gz
Acme::Chef::Recipe 1.00 S/SM/SMUELLER/Acme-Chef-1.01.tar.gz

我基本上想知道这些行是如何生成的。

程序是否类似于:
  • 找到所有 .pm dist 文件中的文件
  • 加载每个 .pm文件并打印出 ${ "${pkg}::VERSION"}在哪里 $pkg是与.pm 对应的包名文件名(即如果 .pm 文件名是 Foo/Bar.pm 那么 $pkgFoo::Bar 。)

  • 是否有执行此索引过程的代码?

    你真的必须加载模块才能确定它的版本吗?

    最佳答案

    执行 PAUSE 的实际代码是 on GitHub here .解析包和版本声明的子程序在 lib/PAUSE/pmfile.pm ( packages_per_pmfileparse_version )。就使 CPAN 工作发生的事情而言,这是权威的,但它不是您想要为自己使用的代码 - PAUSE 已经有将近 20 年的历史了,即使经过最近的一些清理,它仍然很糟糕。

    相反,请查看 Module::Metadata .你给它一个文件,它提供了一个非常简单的界面来发现该文件中的包的名称以及它们的版本可能是什么。

    这很简单:

    my $mm = Module::Metadata->new_from_file("My/Module.pm");
    for my $package ($mm->packages_inside) {
    print "$package: ", $mm->version($package), "\n";
    }

    确实,这种“单线”有效:
    find Acme-Chef-1.01 -name \*.pm \
    | perl -MModule::Metadata -ln \
    -e 'my $mm = Module::Metadata->new_from_file($_); ' \
    -e 'print "$_: ", $mm->version($_) for $mm->packages_inside' \
    | sort

    和输出:
    Acme::Chef: 1.01
    Acme::Chef::Container: 1.00
    Acme::Chef::Ingredient: 1.00
    Acme::Chef::Recipe: 1.00

    关于perl - 从 CPAN dist 文件中获取 "defined"模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18264747/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com