【发布时间】:2013-10-20 07:55:47
【问题描述】:
我编写了一些模块,并尝试运行它们。我如何知道从哪里获取模块?
我在 Windows 中编写,并尝试将其放入 c:\perl\lib 但没有帮助。
我可以把它和调用模块的文件放在同一个目录吗?
【问题讨论】:
标签: perl
我编写了一些模块,并尝试运行它们。我如何知道从哪里获取模块?
我在 Windows 中编写,并尝试将其放入 c:\perl\lib 但没有帮助。
我可以把它和调用模块的文件放在同一个目录吗?
【问题讨论】:
标签: perl
Perl 使用以下路径:
@INC
搜索模块。 (.pm 文件)
如果你:
perl -e 'print join "\n", @INC;'
您将看到当前正在搜索哪些路径以查找模块。 (这个@INC 列表被编译成perl 可执行文件)
那么你可以:
BEGIN { unshift @INC, 'C:\mylibs' }
或
use lib 'C:\mylibs'
并将 MyModule.pm 放在 C:\mylibs 中以启用:
use MyModule;
【讨论】:
这正是local::lib 旨在处理的问题。默认情况下,use local::lib; 会将 ~/perl5 添加到您的模块搜索路径 (@INC),但您可以轻松地告诉它添加另一个目录。
如果您使用固定目录(而不是相对于您的主目录的目录)执行此操作,那么您可能与use lib 'PATH' 一样好。
如果这是只从命令行运行的代码,另一个选项是创建一个指向您个人模块目录的PERL5LIB 环境变量。这将影响您的用户帐户从命令行运行的所有 Perl,因此您根本不需要使用此方法修改您的 Perl 代码,但设置非命令行代码(例如,Web 脚本) 并且,如果代码将由多个用户运行,则需要为所有用户设置PERL5LIB。
无论如何,我都不建议直接使用@INC。现在有很多更简单的方法可以做到这一点。
【讨论】:
对于特定于应用程序的库,常见的方法是使用FindBin 模块定位应用程序目录,然后使用use lib 将应用程序的库添加到@INC:
use FindBin;
use lib "$FindBin::Bin/lib";
use AppModule;
对于通用模块,我建议以与 CPAN 版本相同的方式开发它们(例如,以 module-starter 开头)并使用 perl 安装它们(通常在 site/lib 下)。另见:Which framework should I use to write modules?
如果您不能使用 perl 安装(即您没有必要的权限),您可以使用个人库来代替。请参阅 perlfaq8 中的 How do I keep my own module/library directory?。
【讨论】: