Perl 我是否应该将utilities.pl更改为utilities.pm模块?

Perl 我是否应该将utilities.pl更改为utilities.pm模块?,perl,perl-module,Perl,Perl Module,在我们的产品中,我们在许多文件的开头都有一个大的实用程序文件(带有do)。有没有理由不把它变成一个模块?例如,不要这样做: do '../dbi_utilities.pl'; our ($db,$user,$pw,$attr); my $Data = DBI->connect($db,$user,$pw,$attr) or die "Could not connect to database: $DBI::errstr"; 我就不能这么做吗 use AppUtil; my $Data =

在我们的产品中,我们在许多文件的开头都有一个大的实用程序文件(带有
do
)。有没有理由不把它变成一个模块?例如,不要这样做:

do '../dbi_utilities.pl';
our ($db,$user,$pw,$attr);
my $Data = DBI->connect($db,$user,$pw,$attr) or die "Could not connect to database: $DBI::errstr";
我就不能这么做吗

use AppUtil;
my $Data = AppUtil->connect();

用它制作一个模块将使它更加健壮。现在很多事情非正式地相互依赖,但这些依赖性并不是很明显

此外,它还允许您仅导入部分实用程序。

使用do(),您每次都在加载和编译utilities.pl文件,如果您多次执行()操作,可能会导致问题。另外,
use
是在编译时完成的,这将允许您的程序更快地失败,甚至可以使用
perl-wc
进行测试

最后,将它保存在一个包中可以保护它的名称空间,这在项目增长时会很有帮助


我强烈建议您将utilites.pl转换成一个合适的Perl包,该包中加载了
使用
您可以获得所有很酷的模块内容、封装、模块特定的函数等等

但是请注意,在语法中使用
use
。为AppUtil命名空间创建对象,并调用connect子例程。为您的实用程序

此外,你必须有1;在文件的末尾


坚持使用另一种方法意味着您不必更改任何代码,也不必在末尾添加1


所有“do”、“use”和“require”导入,但它们内部的作用域代码(命名子例程除外,因为它们无法隐藏)。

不这样做的唯一原因是时间

也就是说,清理您的界面以及所有调用应用程序以使用新界面需要时间


当您开始使用适当的测试(“make test”或“../Build test”或只是“prove…”)并且能够在签入之前检查您的更改不会破坏任何内容时,您现在所花费的时间将远远超过弥补。所以,无论如何,转换。请注意,这不是免费获得的。

通过适当的重构将代码转换为模块,您可以轻松地进行测试。我在为Perl杂志撰写的文章以及关于Perlmonks的文章中谈到了这一点


祝你好运,

将某些东西制作成模块并不会神奇地为你提供任何功能。你必须正确地编码它。还请注意,do和require不会自动导入。@布赖恩:您的权利。由程序员编写功能代码。