Another question让我思考了代码重用的不同方法:use
与 require
与 do
我在这里看到很多帖子,其中的问题集中在使用 require
加载和执行代码。在我看来,这显然是一种不好的做法,但我还没有找到任何关于这个问题的好资源可以向人们指出。
perlfaq8涵盖了 use
和 require
之间的区别,但它没有提供任何有关偏好的建议(从 5.10--in 5.8.8 there is a quick bit of advice in favor of use 开始)。
这个话题似乎缺乏讨论。我有几个问题希望大家讨论:
- Perl 中代码重用的首选方法是什么?
使用模块名称;
需要模块名称;
需要'file.pl';
do 'file.pl';
require ModuleName
和require "file.pl"
之间有什么区别?- 使用
require "file.pl"
是个好主意吗?为什么或为什么不?
最佳答案
标准做法是大部分时间使用use
,偶尔使用require
,很少使用do
。
do 'file'
会将 file
作为 Perl 脚本执行。这几乎就像对文件内容调用eval
;如果您多次执行
同一个文件(例如在循环中),每次都会对其进行解析和评估,这不太可能是您想要的。 do
和 eval
之间的区别在于,do
无法看到封闭范围内的词法变量,这使得它更安全。 do
有时对于简单的任务很有用,例如处理以 Perl 代码形式编写的配置文件。
require 'file'
与 do 'file'
类似,不同之处在于它只会解析任何特定文件一次,并且在出现问题时会引发异常。 (例如,找不到文件、包含语法错误等)自动错误检查使其成为 do 'file'
的良好替代品,但它仍然只适合相同的简单用途.
do 'file'
和 require 'file'
形式是很久以前 *.pl 文件扩展名意味着“Perl 库”的延续。在 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
这样的文件名,而后一种形式需要以文件名开头。不过,按照惯例,第一种形式用于加载模块,而第二种形式用于加载库。
关于perl - 在 Perl 中,使用模块比使用文件更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2180554/