在Perl中,使用模块比使用文件更好吗?
Another question让我想到了不同的代码重用方法:use vs. require vs. do
我看到很多帖子在这里的问题集中在使用require加载和执行代码。这似乎是一个明显的坏习惯,但我没有找到任何好的资源,在这个问题,我可以指向人。 perlfaq8涵盖使用和要求之间的差异,但它不提供任何有关偏好的建议(从5.8.8 there is a quick bit of advice in favor of use年的5.10 – )。 这个话题似乎缺乏讨论。我有几个我想讨论的问题: >在Perl中代码重用的首选方法是什么? >使用ModuleName; > require ModuleName和require“file.pl”之间有什么区别? 解决方法
标准做法是使用大部分时间,偶尔需要,很少做。
do’file’将以Perl脚本执行文件。这几乎就像调用eval对文件的内容;如果你做同一个文件多次(例如在一个循环),它将被解析和评估每次,这不太可能是你想要的。 do和eval之间的区别在于do不能在封闭范围中看到词法变量,这使得它更安全。 do偶尔对于简单任务非常有用,例如处理以Perl代码形式编写的配置文件。 require’file’就像do’file’,除了它只会解析任何特定的文件一次,并且如果出现错误会引发异常。 (例如,无法找到文件,它包含语法错误等)。自动错误检查使它成为do’file’的一个很好的替代,但它仍然只适用于相同的简单用法。 do’file’和require’file’格式是从* .pl文件扩展名意味着“Perl库”的天过去的转载。在Perl中重用代码的现代方法是将它组织成模块。调用某个“模块”而不是“库”只是语义,但这些词意味着在Perl文化中明显不同的东西。图书馆只是一个子程序的集合;一个模块提供了一个命名空间,使它更适合重用。 use模块是使用模块代码的正常方式。请注意,Module是作为裸字的包名,而不是包含文件名的带引号字符串。 Perl处理从包名到您的文件名的转换。 use语句在编译时发生,如果失败则抛出异常。这意味着如果你的代码依赖的模块不可用或无法加载错误将立即显现。此外,如果模块的import()方法有一个可以节省你一点打字,使用自动调用。 require模块类似于使用模块,除了它发生在运行时,并且不会自动调用模块的import()方法。通常你想使用尽早和可预测的失败,但有时需要更好。例如,可以使用require来延迟大模块的加载,这只是偶尔需要的或者使模块可选。 (即,如果模块可用,则使用该模块,但如果不是,则会降低功能)。 严格来说,require Module和require’file’之间的唯一区别是,第一种形式触发从包名称(如Foo :: Bar)到Foo / Bar.pm等文件名的自动翻译,而后者则需要一个文件名从…开始。按照惯例,第一种形式用于加载模块,而第二种形式用于加载库。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |