另一个问题让我想到了不同的代码重用方法:use
vs. require
vs.do
我在这里看到很多帖子,其中的问题集中在require
加载和执行代码的使用上.在我看来,这显然是一种不好的做法,但我没有找到任何有关我能指出的问题的好资源.
perlfaq8涵盖了use
和之间的差异require
,但它没有提供任何关于偏好的建议(从5.10开始 - 在5.8.8中有一些建议支持使用).
这个话题似乎缺乏讨论.我有几个问题需要讨论:
use ModuleName;
require ModuleName;
require 'file.pl';
do 'file.pl';
require ModuleName
和之间有什么区别require "file.pl"
?require "file.pl"
?为什么或者为什么不?Mic*_*man 71
标准做法是use
大多数时间,require
偶尔使用,do
很少使用.
do 'file'
将file
作为Perl脚本执行.这几乎就像调用eval
文件的内容一样; 如果您do
多次使用相同的文件(例如在循环中),则每次都会对其进行解析和评估,这不太可能是您想要的.之间的区别do
和eval
是do
无法看到的封闭范围,这使得它更安全词法变量.do
偶尔对于处理以Perl代码形式编写的配置文件这样的简单任务很有用.
require 'file'
就像do 'file'
不同的是它只会解析任何特定的文件一次,如果出现问题将引发异常.(例如,找不到文件,它包含语法错误等)自动错误检查使其成为一个很好的替代品,do 'file'
但它仍然只适用于相同的简单用途.
这些do 'file'
和require 'file'
表单是*.pl文件扩展名为"Perl Library"的日子过去的结转.在Perl中重用代码的现代方法是将其组织到模块中.将某个东西称为"模块"而不是"库"只是语义,但这些词在Perl文化中意味着截然不同的东西.库只是子程序的集合; 模块提供命名空间,使其更适合重用.
use Module
是使用模块代码的常规方法.请注意,Module
包名称是一个裸字,而不是包含文件名的带引号的字符串.Perl处理从包名到文件名的转换.use
语句在编译时发生,如果失败则抛出异常.这意味着如果您的代码所依赖的模块不可用或无法加载,则错误将立即显现.此外,如果模块use
的import()
方法可以节省您一点点输入,则自动调用模块的方法.
require Module
就像use Module
不同的是它发生在运行时,不会自动调用该模块的import()
方法.通常情况下,您希望use
尽早和可预测地使用失败,但有时候require
会更好.例如,require
可用于延迟仅偶尔需要的大型模块的加载或使模块可选.(即,如果模块可用,则使用该模块,但如果不是,则使用该模块或减少功能.)
严格来说,require Module
和之间的唯一区别require 'file'
是第一种形式触发从包名称Foo::Bar
到文件名的自动转换,就像Foo/Bar.pm
后一种形式需要文件名开头一样.但按照惯例,第一种形式用于加载模块,而第二种形式用于加载库.
使用时有一个主要的偏好use
,因为它BEGIN {}
在编译期间发生在较早的状态,并且错误倾向于在更合适的时间传播给用户.它还调用sub import {}
函数,使调用者可以控制导入过程.这是大量使用的东西.您可以通过调用特定的命名空间来获得相同的效果,import
但这需要您知道命名空间的名称和文件,并编写对子例程的调用...这是更多的工作.相反,use
只需要您知道命名空间,然后它需要具有匹配命名空间的文件 - 从而使命名空间和文件之间的链接对用户而言不那么有意义.
阅读perldoc -f use
,以及perldoc -f require
更多信息.Per perldoc -f use
:
use
是相同的,BEGIN { require Module; Module->import( LIST ); }
哪个更难看.
主要区别在于进口/出口.use
在使用模块时首选,因为它允许您指定要导入命名空间的例程:
use MyModule qw(foo bar baz); # allows foo(), bar() and baz() to be used
use MyModule qw(); # Requires explicit naming (e.g. MyModule::foo).
Run Code Online (Sandbox Code Playgroud)
use
还运行模块的import()
程序,该程序通常用于设置模块.
有关详细信息,请参阅perldoc以供使用.
归档时间: |
|
查看次数: |
31867 次 |
最近记录: |