在Perl中,使用模块比使用文件更好吗?

dao*_*oad 51 perl

另一个问题让我想到了不同的代码重用方法:usevs. requirevs.do

我在这里看到很多帖子,其中的问题集中在require加载和执行代码的使用上.在我看来,这显然是一种不好的做法,但我没有找到任何有关我能指出的问题的好资源.

perlfaq8涵盖了use和之间的差异require,但它没有提供任何关于偏好的建议(从5.10开始 - 在5.8.8中有一些建议支持使用).

这个话题似乎缺乏讨论.我有几个问题需要讨论:

  1. Perl中首选的代码重用方法是什么?
    • use ModuleName;
    • require ModuleName;
    • require 'file.pl';
    • do 'file.pl';
  2. require ModuleName和之间有什么区别require "file.pl"
  3. 使用它是不是一个好主意require "file.pl"?为什么或者为什么不?

Mic*_*man 71

标准做法是use大多数时间,require偶尔使用,do很少使用.

do 'file'file作为Perl脚本执行.这几乎就像调用eval文件的内容一样; 如果您do多次使用相同的文件(例如在循环中),则每次都会对其进行解析和评估,这不太可能是您想要的.之间的区别doevaldo无法看到的封闭范围,这使得它更安全词法变量.do偶尔对于处理以Perl代码形式编写的配置文件这样的简单任务很有用.

require 'file'就像do 'file'不同的是它只会解析任何特定的文件一次,如果出现问题将引发异常.(例如,找不到文件,它包含语法错误等)自动错误检查使其成为一个很好的替代品,do 'file'但它仍然只适用于相同的简单用途.

这些do 'file'require 'file'表单是*.pl文件扩展名为"Perl Library"的日子过去的结转.在Perl中重用代码的现代方法是将其组织到模块中.将某个东西称为"模块"而不是"库"只是语义,但这些词在Perl文化中意味着截然不同的东西.库只是子程序的集合; 模块提供命名空间,使其更适合重用.

use Module是使用模块代码的常规方法.请注意,Module包名称是一个裸字,而不是包含文件名的带引号的字符串.Perl处理从包名到文件名的转换.use语句在编译时发生,如果失败则抛出异常.这意味着如果您的代码所依赖的模块不可用或无法加载,则错误将立即显现.此外,如果模块useimport()方法可以节省您一点点输入,则自动调用模块的方法.

require Module就像use Module不同的是它发生在运行时,不会自动调用该模块的import()方法.通常情况下,您希望use尽早和可预测地使用失败,但有时候require会更好.例如,require可用于延迟仅偶尔需要的大型模块的加载或使模块可选.(即,如果模块可用,则使用该模块,但如果不是,则使用该模块或减少功能.)

严格来说,require Module和之间的唯一区别require 'file'是第一种形式触发从包名称Foo::Bar到文件名的自动转换,就像Foo/Bar.pm后一种形式需要文件名开头一样.但按照惯例,第一种形式用于加载模块,而第二种形式用于加载库.


Eva*_*oll 9

使用时有一个主要的偏好use,因为它BEGIN {}在编译期间发生在较早的状态,并且错误倾向于在更合适的时间传播给用户.它还调用sub import {}函数,使调用者可以控制导入过程.这是大量使用的东西.您可以通过调用特定的命名空间来获得相同的效果,import但这需要您知道命名空间的名称和文件,并编写对子例程的调用...这是更多的工作.相反,use只需要您知道命名空间,然后它需要具有匹配命名空间的文件 - 从而使命名空间和文件之间的链接对用户而言不那么有意义.

阅读perldoc -f use,以及perldoc -f require更多信息.Per perldoc -f use:
use是相同的,BEGIN { require Module; Module->import( LIST ); }哪个更难看.


mop*_*oke 7

主要区别在于进口/出口.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以供使用.