我发现在我的Perl脚本中重复了以下反模式:脚本包含一些特定于机器/设置的设置,我将其作为常量存储在脚本中,而脚本的其余部分本质上是通用的:
#!/usr/bin/perl
use strict;
use warnings;
# machine specific settings at the start of the script.
my $SETTING_1 = "foo";
my @SETTING_2 = ("123", "456");
my $SETTING_3 = "something";
# general part of script follows.
...
Run Code Online (Sandbox Code Playgroud)
在一台机器上运行时,这种模式有点好,但是一旦我想将脚本分发到多台机器上就会出现问题,因为我必须跟踪,因此我不会在常规部分中使用新的更新覆盖设置部分.
正确的解决方案显然是拥有一个通用脚本文件,并让它读取一个特定于脚本运行环境的配置文件.
我的问题是:您建议使用哪种CPAN模块来解决此问题?为什么?
我已经在我的MacBook Pro上通过CPAN安装了模板模块,它似乎安装正确.
但是,当我尝试运行包含模块模块的脚本时,我得到以下内容:
无法在@INC中找到Template.pm(@INC包含:/ Users/purinkle/Sites/rob/modules /Library/Perl/Updates/5.10.0/darwin-thread-multi-2level/Library/Perl/Updates/5.10.0 /System/Library/Perl/5.10.0/darwin-thread-multi-2level /System/Library/Perl/5.10.0/Library/Perl/5.10.0/darwin-thread-multi-2level/Library/Perl/5.10.0 /Network/Library/Perl/5.10.0/darwin-thread-multi-2level /Network/Library/Perl/5.10.0/Network/Library/Perl/System/Library/Perl/Extras/5.10. 0/darwin-thread-multi-2level /System/Library/Perl/Extras/5.10.0.)at ./index.pl第12行.
BEGIN失败 - 编译在./index.pl第12行中止.
然后我认为在安装过程中出现问题并尝试通过CPAN再次安装但收到以下消息:
模板是最新的(2.22).
然后我运行了instmodsh命令来尝试找到模块的安装位置.instmodsh列出了这些目录:
/选择/ local/bin目录
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Manual
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Namespace
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Plugin
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Stash
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Tools
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Tutorial
/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/Template/Stash/XS
/选择/本地/共享/人/ MAN1
/选择/本地/共享/人/ man3
看起来我有一些如何安装两个不同版本的Perl(5.8.9和5.10.0),这导致CPAN和其他Perl脚本之间的混淆.
如何验证此问题以及如何解决此问题?
我已经运行了命令
which perl
which cpan
Run Code Online (Sandbox Code Playgroud)
他们都返回/ opt/local/bin
运行
find / -name perl
Run Code Online (Sandbox Code Playgroud)
回报
find:/ dev/fd/3:不是目录
find:/ dev/fd/4:不是目录
/选择/ local/bin中/ perl的
/opt/local/etc/bash_completion.d/perl
/opt/local/var/macports/software/bash-completion/1.2_0/opt/local/etc/bash_completion.d/perl
/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/perl
/opt/local/var/macports/sources/rsync.macports.org/release/ports/perl
在/ usr/bin中/ perl的
在/ usr/local/bin中/ perl的
在/ usr /共享/文件/魔法/ perl的
和
find / -name cpan
Run Code Online (Sandbox Code Playgroud)
回报
/选择/ local/bin目录/ CPAN
/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/cpan …
CPAN上的一些模块有很好的文档记录,其他模块也不是很多,但通常很容易辨别出如何通过现有技术使用模块(例如使用你想要使用的模块的模块/测试).我想知道找到使用您想要使用的代码的代码的最佳方法是什么.
例
我想使用(也许?)Dist::Zilla::App::Tester某些东西,但作者选择不写任何关于如何使用它的文档,有些我想知道找到已经使用它的代码的阻力最小的路径.
请不要回答这个模块
给一个人一条鱼; 你今天喂他了.教一个人钓鱼; 你已经喂了他一辈子了
当我make test使用CPAN模块具有的常规测试工具运行时,它将只输出一个简短的摘要(如果一切顺利).
t/000_basic.t .......................... ok
t/001_db_handle.t ...................... ok
t/002_dr_handle.t ...................... ok
t/003_db_can_connect.t ................. ok
... snip ...
All tests successful.
Files=30, Tests=606, 2 wallclock secs
Result: PASS
Run Code Online (Sandbox Code Playgroud)
如果我单独运行测试,它们会输出更详细的信息.
1..7
ok 1 - use DBIx::ProcedureCall::PostgreSQL;
ok 2 - simple call to current_time
ok 3 - call to power() with positional parameters
ok 4 - call to power() using the run() interface
ok 5 - call to setseed with a named parameter
ok 6 - call a table function
ok …Run Code Online (Sandbox Code Playgroud) CPAN上的Config :: Namespace中有很多模块,但它们都是以有限的方式限制的.
我目前正在使用Config :: Std,这在大多数情况下很好,但是它会使某些事情变得困难:
解析配置后,Config :: Std会生成一个受祝福的hashref,因此我的所有应用程序都被编码为使用hashref进行配置.我不想改变它.
我正在寻找的是一个通用,轻量级的配置模块,它产生一个hashref.
我的问题是:我应该考虑更换Config :: Std的哪些配置模块?
我正在维护一个包含超过100个.pm文件的CPAN发行版.他们每个人都需要有一个$ VERSION,还是可以将它包含在主模块中?
对于发行版中的其他模块,包括或不包括$ VERSION有什么影响?
如果它与问题相关,那么人们应该只是"使用" - 这个分布中的主要模块.并且,出于这个问题的目的,我不是在询问它应该如何在任何文件中指定,只是它是否以任何形式存在.
我试图在我的系统上第一次使用Perl,这是Ubuntu 12.04.我安装了Perl v.5.14.2.
我查找了如何安装Perl模块,所以我开始如下:
$ perl -MCPAN -e shell
Run Code Online (Sandbox Code Playgroud)
该向导开始配置环境,如下所示:http://pastebin.com/5hn8vkb5
尽管如此,它在中间停止并显示以下错误消息:
...
Checksum for /home/john/.cpan/sources/authors/id/A/AP/APEIRON/local-lib-1.008009.tar.gz ok
---- Unsatisfied dependencies detected during ----
---- APEIRON/local-lib-1.008009.tar.gz ----
ExtUtils::MakeMaker [build_requires]
Running make test
Make had some problems, won't test
Delayed until after prerequisites
Running make install
Make had some problems, won't install
Delayed until after prerequisites
Can't locate local/lib.pm in @INC (@INC contains:
/home/john/perl5/lib/perl5
/etc/perl
/usr/local/lib/perl/5.14.2
/usr/local/share/perl/5.14.2
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.14
/usr/share/perl/5.14
/usr/local/lib/site_perl
/home/john/Desktop)
at /usr/share/perl/5.14/CPAN/FirstTime.pm line …Run Code Online (Sandbox Code Playgroud) 我正在考虑将Perl作为初学者.我想尝试一些CPAN模块.当我在我的Osx控制台上运行安装命令时,CPAN会要求使用以下语句进行配置:
要安装模块,您需要配置本地Perl库目录或升级您的权限.CPAN可以通过引导local :: lib模块或将自身配置为使用"sudo"(如果可用)来帮助您.如果您需要自定义设置,也可以手动解决此问题.
你想要什么方法?(选择'local :: lib','sudo'或'manual')
local::lib和sudo选项有什么区别?如果我理解得很好,它会在我的计算机上本地安装一些模块.但我没有看到上面两个配置之间有任何区别.
使用pip,您可以创建需求文件以指定要安装的库.是否有使用CPAN的perl模块的等效项?
我遇到了ExtUtils :: MakeMaker,但这看起来像make文件专门用于每个模块.
我想尝试更好地了解我所问的是否有办法做某事
cpan install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
然后指定要在该需求文件中安装的模块.
提前致谢!
我找不到CPAN安装文件的权威/全面描述.我假设必须有一组规则并且它不像"XYZ目录"那么简单,因为,例如,Linux盒子上的多个用户可以运行CPAN,即使有一个Perl安装并且它仍然以某种方式工作.那么,那些规则是什么?
这个问题的第二部分:PERL5LIB环境变量的文档说它是"在查看标准库和当前目录之前查找Perl库文件的目录列表."
我假设CPAN没有安装到标准库位置,因为可能是针对特定Perl版本修复的.那么CPAN可能会安装到PERL5LIB中吗?
最后,正如我已经提到的,CPAN如何处理多个用户可能正在运行相同的Perl安装的事实?对不起,如果这是一个单独的问题,但似乎可能相关.