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

标签 perl

Another question让我思考了代码重用的不同方法:userequiredo

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

perlfaq8涵盖了 userequire 之间的区别,但它没有提供任何有关偏好的建议(从 5.10--in 5.8.8 there is a quick bit of advice in favor of use 开始)。

这个话题似乎缺乏讨论。我有几个问题希望大家讨论:

  1. Perl 中代码重用的首选方法是什么?
    • 使用模块名称;
    • 需要模块名称;
    • 需要'file.pl';
    • do 'file.pl';
  2. require ModuleNamerequire "file.pl" 之间有什么区别?
  3. 使用 require "file.pl" 是个好主意吗?为什么或为什么不?

最佳答案

标准做法是大部分时间使用use,偶尔使用require,很少使用do

do 'file' 会将 file 作为 Perl 脚本执行。这几乎就像对文件内容调用eval;如果您多次执行同一个文件(例如在循环中),每次都会对其进行解析和评估,这不太可能是您想要的。 doeval 之间的区别在于,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 Modulerequire 'file' 之间的唯一区别是,第一个表单会触发像 Foo 这样的包名称的自动翻译: :Bar 到像 Foo/Bar.pm 这样的文件名,而后一种形式需要以文件名开头。不过,按照惯例,第一种形式用于加载模块,而第二种形式用于加载库。

关于perl - 在 Perl 中,使用模块比使用文件更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2180554/

相关文章:

perl - 如何使用 WWW::Mechanize 检查单选框?

python - 是否有 pydbg 模块的 Perl 等效模块?

perl - 如何在 Perl 和 Moose 中编写工厂代码?

regex - 如何在 Perl 正则表达式中允许文字点?

perl - 无法通过包 "new"定位对象方法 "IO::Socket::SSL"

使用 Net::OpenSSH 将 Perl 文件传输到远程服务器

perl - 反转哈希、获取其键并排序

perl - 如何将稍后创建的小部件对象发送到 Tk 中的回调?

regex - 使用 sed/awk 从小节中删除字符串

perl - 如何在html树中向上移动节点并提取链接?