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

时间:2012-06-06 20:33:34

标签: perl

分析CPAN模块的来源我可以看到类似这样的内容:

...
package # hide from PAUSE
   Try::Tiny::ScopeGuard;
...

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

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

2 个答案:

答案 0 :(得分:21)

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

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

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

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

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

以下是来自Forks::Super

no_index规范的示例
no_index:
    directory:
        - t
        - inc
    package:
        - Sys::CpuAffinity
        - Signals::XSIG
        - Signals::XSIG::Default
        - Signals::XSIG::TieArray56

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

答案 1 :(得分:-3)

好吧,这是对这种现象的又一次打击......我已经打了几十年的黑客攻击Perl并且我很少看到这种破解,可能只是被忽视而且从不打扰调查。但有一点似乎很清楚。在PAUSE中进行了一些hackish处理,这是在Perl'n'UNIX学院的思想中精心设计的,没有疑问的阴影涉及面向行的文本解析,所以他们解析那些Perl文件,甚至可能使用{{ 1}},而是grep本身,谁知道,提取包名称,然后踢一些程序或得到一些统计数据或诸如此类的东西。并且为了绊倒这个程序并且破解它的方式,作者将包声明分成两行,所以hacky packy grep作业没有一个线索,声称它的鼻子下方有一个包,程序员对他的hacky技能感到高兴和PAUSE统计数据或它们正在拼凑的任何东西都是应该的。这有意义吗?