【发布时间】:2014-05-01 05:52:16
【问题描述】:
在我的last question@Borodin 中评论了我的问题:
您应该首先删除 Modern::Perl 和 namespace::sweep。 应避免使用表现为 pragma 的模块。
我有点困惑,因为:
- 在最新的Moose BestPractices manual 推荐使用
namespace::autoclean。
use namespace::autoclean 位只是良好的代码卫生,因为它 在结束时从类的命名空间中删除导入的符号 你的包的编译周期,包括 Moose 关键字。一旦上课 已经建好了,这些关键字就不需要了。 (这是首选 不要将 Moose 放在包裹的末尾)。
在书中Intermediate perl 也推荐使用namespace::autoclean。
是的,我用 autoclean 代替 sweep 模块 - 因为又是 from the doccu
编写此 pragma 是为了解决优秀的 命名空间::自动清理。特别是, namespace::autoclean 将删除 超载安装的特殊符号,所以不能使用 namespace::autoclean 在重载 Perl 运算符的对象上。
... ...
在大多数情况下,namespace::sweep 应该可以作为替代品 对于命名空间::autoclean。发布后,此编译指示通过所有 namespace::autoclean 的测试,除了它自己的。
而且因为我是 perl 初学者,我真的很困惑。对我来说,当我阅读:这个模块解决了另一个模块的一些问题 - 意思是:使用这个。
'手册(我应该从哪里学习)说“使用它”和来自 stackoverflow teling 的专家:不要使用它。
所以请有人解释一下:
- 使用
namespace::sweep是正确的还是我应该使用namespace::autoclean或者一个都不用? - 如果没有,为什么最佳实践推荐它?
对于“ModernPerl”。当然,我可能并不深入和“确切地”理解它的作用。我所知道的,(再次来自它的 doccu)
这会启用 strict 和 warnings pragma,以及所有 Perl 5.10 中可用的功能。它还支持 C3 方法解析 按 perldoc mro 中记录的顺序并加载 IO::File 和 IO::Handle 这样您就可以在文件句柄上调用方法。未来,它可能 包括额外的核心模块和编译指示。
当然,不深入了解mro,只认为这是对多重继承情况下“致命钻石”问题的解答。
直到今天,我都对它感到非常满意,因为它缩短了我所需的 pragma:
use strict;
use warnings;
use feature 'say';
那么,“Modern::Perl”(以及其他类似的 cpanm 模块)的“状态”是什么?是否允许使用?
【问题讨论】:
-
自从你引用我的书以来,你已经得到了我的答案。你应该避免模块作为模块的建议有点奇怪,因为 pragmata 是模块。
-
@briandfoy:我说的是“应该避免像编译指示一样的模块”。我指的是
Modern::Perl,它的大写意味着它增加了功能,但没有对以下代码的上下文进行其他更改。它的行为掩盖了这一点。我对namespace::autoclean很满意,它可能会有所帮助,但我相信大多数简单 Perl 程序的样板应该是use strict和use warnings,仅此而已 -
@Borodin 对不起,你说:'remove namespace::sweep'。我将继续使用
namespace::autoclean或namespace::sweep- 因为它被推荐(作为良好的代码卫生)。无论如何,从现在开始 - 我不会使用Modern::Perl- 所以,你的评论教会了我一些新的东西。谢谢。 -
我不认为 Modern::Perl 暗示了这些。各种非编译指示模块都会改变以下代码的上下文。