为什么"package"关键字有时会被包名称中的注释分开?

Art*_*rtM 12 perl

分析CPAN模块的来源我可以看到这样的事情:

...
package # hide from PAUSE
   Try::Tiny::ScopeGuard;
...
Run Code Online (Sandbox Code Playgroud)

显然,它取自Try::Tiny,但我也看到了其他模块中关键字和包标识符之间的这种评论package.

为什么使用此程序?它的目标是什么,它有什么好处?

mob*_*mob 21

从PAUSE的索引器中隐藏一个包确实是一个黑客攻击.

将分发上载到PAUSE时,索引器将检查上载中的每个文件,查找分发中包含的软件包的名称.任何索引包都可以显示在CPAN搜索结果中.

不希望索引器发现您的包有很多原因.您的发行版可能包含许多小的或无关紧要的程序包,这些程序包会使模块的搜索结果变得混乱.您可能在t(测试)目录中定义了包,或者某些其他非标准目录中的包不是作为发行版的一部分安装的.您的发行版可能包含来自完全不同的发行版的文件(其他人写的).

该hack有效,因为索引器严格查找关键字package和在同一行上看起来像包名称的表达式.

如今,您可以META.yml在分发中包含一个文件.PAUSE索引器将查找并遵守no_index此文件中的规范.但这是索引器相对较新的功能,因此较旧的模块和老式CPAN贡献者仍将使用换行黑客.

这是一个no_index规范的例子Forks::Super

no_index:
    directory:
        - t
        - inc
    package:
        - Sys::CpuAffinity
        - Signals::XSIG
        - Signals::XSIG::Default
        - Signals::XSIG::TieArray56
Run Code Online (Sandbox Code Playgroud)

Sys::CpuAffinity并且Signals::XSIG是与之一起打包的单独发行版Forks::Super.某些测试脚本包含不应编入索引的package声明(例如Arbitrary::Test::Package).