我想安装一个Perl模块(在本例中为FindBin),但由于它包含在Perl 5.10.1发行版中,所以cpan想为我安装Perl 5.10.有没有办法只安装模块cpan?
我能看到的唯一选择是直接从源代码安装,这看起来有点粗糙,因为没有单独的软件包(例如Makefile.PL,等等),只是裸.pm文件.
由于这是一个只有一个文件的小模块,在这种情况下它是可行的,但如果我想安装一个更大的包呢?
编辑:这是从原来的问题有点一边,但说话的模块的一般问题被包装以Perl分布:我发现,"独立" FindBin(版本1.49)有一个语法错误,所以我取回1.50版本出来的Perl 5.10.1发行版...但是由于模块现在作为Perl 5.10的一部分在CPAN上列出,我无法找到描述此delta中更改/修复内容的CHANGES文件.我是否应该进入开发者存储库来提取这些信息是否合理?)
编辑2.好的,这是一个更好的例子.在Perl 5.8.8上我有1.04版本的Carp.但是,我看到Perl 5.10.1与1.11版打包在一起.有没有办法让CPAN为我安装最新版本的Carp而不会拖延所有的Perl 5.10.1?除了perl 5.10.1安装之外,我甚至找不到CPAN上Carp模块的链接.
在查看我接手的一些代码时,我遇到了这一行:
my @files = My::Module::DB::raw_info->search_like(customer_handle => $config->{client}, feed => $config->{site}, arrival =>"$date")
Run Code Online (Sandbox Code Playgroud)
我知道这会从一个名为的包中返回一个数组My::Module::DB::raw_info.
我不确定(我只是学习OOP),是->search_like指的是什么.
我没有将其视为变量或子程序 My::Module::DB::raw_info
任何提示将不胜感激.我才开始学习这些东西.这就像在火中沐浴.(我知道我以后会更开心)Yikes!
我没有对我的工作遥控盒root权限,所以我使用的描述cpanm和地方:: 11b的组合,在这里安装CPAN模块包装盒上的我的本地目录.使用cpanm,我假设cpanm Module::To::Update会在我的本地库中安装最新版本的模块.
显然,我不需要root权限来使用CPAN升级我的模块,就像我刚刚尝试过的那样,升级过程非常顺利.但是,我仍然很好奇Perl将使用哪个版本的模块:本地版本,还是默认的CPAN版本?或者只使用较新的?
如果这存在于perldoc或Stack Overflow中,我也会很感激.我试过搜索两个,但我找不到它= /
如果我错了,请纠正我,但基于XS和Dynaloader的模块是那些使用C/C++共享对象(.so)而不是PP(Pure Perl)的模块?
现在假设我有一台机器,它没有任何网络连接(Solaris 10),我想要安装Crypt::OpenSSL::AES(基于XS的模块),将AES.pm文件复制到@INC中的相关路径不会有任何好处,因为我的系统没有libssl安装.
我的第二个也是最重要的问题是,当我没有CPAN时如何安装这些模块?我的方法是:
libssl我的平台,编译它,但我应该在哪里放置该分片对象文件,以便perl可以找到它?AES.pm到@INC中的相关路径,还是需要配置/制作它?简而言之,我尝试使用网络中每个实例的对象为网络拓扑建模.另外,我有一个顶级经理类,负责管理这些对象并执行完整性检查.文件结构看起来像这样(我遗漏了大多数对象文件,因为它们的结构都非常相似):
Manager.pm
Constants.pm
Classes/
+- Machine.pm
+- Node.pm
+- Object.pm
+- Switch.pm
Run Code Online (Sandbox Code Playgroud)
在OOP中花了几年时间,我是代码重用等的粉丝所以我在thos对象之间建立了继承,继承树(在这个例子中)看起来像这样:
Switch -+-> Node -+-> Object
Machine -+
Run Code Online (Sandbox Code Playgroud)
所有这些对象的结构都是这样的:
package Switch;
use parent qw(Node);
sub buildFromXML {
...
}
sub new {
...
}
# additonal methods
Run Code Online (Sandbox Code Playgroud)
现在有趣的部分:
如何在不静态输入名称的情况下确保正确加载所有这些对象?根本问题是:如果我require "$_" foreach glob("./Classes/*");得到很多"Subroutine new redefined at"错误.我也打得四处use parent qw(-norequire Object),Module::Find以及其他一些@INC以各种组合的修改,使之短:它没有工作.目前我正在静态导入所有使用过的类,它们会自动导入它们的父类.
基本上我要问的是:(perl-)这样做的正确方法是什么?
高级:能够创建更复杂的文件夹结构(因为会有很多对象)并且仍然具有继承+"自动加载"将非常有帮助
我如何"分享我的进口"?我用几个图书馆(我自己的,包含了一些辅助功能,LibXML,Scalar::Util等),我想分享他们当中我的对象.(其背后的原因是,我可能需要为所有对象添加另一个公共库,并且很可能会有超过100个对象 - 没有乐趣手动编辑所有这些对象并且使用正则表达式/脚本执行此操作理论上可以工作但是这似乎不是最干净的解决方案)
我尝试了什么:
Manager.pm- >在Manager包中的Works - 给我一些错误,如"未定义的子程序和Switch :: …我正在研究Perl OO(Perl的新手).我创建了一个简单的示例层次结构:
父类:
#!usr/bin/perl
use strict;
use warnings;
package Objs::Employee;
my $started;
sub new {
my ($class) = @_;
my $cur_time = localtime;
my $self = {
started => $cur_time,
};
print "Time: $cur_time \n";
bless $self;
}
sub get_started {
my ($class) = @_;
return $class->{started};
}
sub set_started {
my ($class, $value) = @_;
$class->{started} = $value;
}
1;
Run Code Online (Sandbox Code Playgroud)
儿童班:
#!/usr/bin/perl
package Objs::Manager;
use strict;
use warnings;
use base qw (Objs::Employee);
my $full_name;
sub new {
my ($class, …Run Code Online (Sandbox Code Playgroud) 有人想在use函数语句中使用数组变量代替数组(列表)文字,如:
my @list = qw(foo zoo);
use Module @list;
Run Code Online (Sandbox Code Playgroud)
代替
use Module qw(foo zoo);
Run Code Online (Sandbox Code Playgroud)
所以她写道:
my @consts = qw(PF_INET PF_INET6);
use Socket @consts;
printf "%d, %d\n", PF_INET, PF_INET6;
Run Code Online (Sandbox Code Playgroud)
看似按预期工作:
2,10
然后,她正在使用其他模块,例如Time::HiRes.代替
use Time::HiRes qw(CLOCK_REALTIME CLOCK_MONOTONIC);
printf "%d, %d\n", CLOCK_REALTIME, CLOCK_MONOTONIC;
Run Code Online (Sandbox Code Playgroud)
0,1
她这样做:
my @consts = qw(CLOCK_REALTIME CLOCK_MONOTONIC);
use Time::HiRes @consts;
printf "%d, %d\n", CLOCK_REALTIME, CLOCK_MONOTONIC;
Run Code Online (Sandbox Code Playgroud)
0,0
它突然不起作用,就像它与Socket模块一起工作!这里发生了一件坏事.
(......这是在非严格的环境中.如果她使用use strict,她甚至会出错.另一方面,她在她的第一个看似有效的例子中没有任何暗示 - 即使她在use strict; use warnings; use diagnostics那里.)
现在她想探索这种奇怪的行为.尝试导入空列表:
my @consts = …Run Code Online (Sandbox Code Playgroud) 我有一个分叉服务器.我在fork之前加载所有模块.
......还是我?我希望在程序中的某个点之后加载的每个模块都将一条消息记录到STDERR.
我打算使用以下内容,但它记录了一些使用的脚本do.
my %ignore = map { $_ => 1 } ( ... );
unshift @INC, sub {
my (undef, $path) = @_;
warn("$path wasn't loaded before forking.\n")
if !$ignore{$path};
return ();
};
Run Code Online (Sandbox Code Playgroud)
我没有想法,但在我花更多时间在这之前,我想知道是否有现有的解决方案.
如何dist.ini为每个平台添加条件先决条件(Windows /非Windows)我希望模块支持?
例如在perl代码中,我可以这样做:
if ( $^0 eq 'MSWin32' ){
require Win32::Foo;
}else{
require Bar::Baz;
}
Run Code Online (Sandbox Code Playgroud)
我如何迎合这样的每个系统/平台,dist.ini以便通过cpan/cpanm安装正确的先决条件?
use WWW::Mechanize;
$mech = new WWW::Mechanize;
$mech->get("http://www.google.com");
$html = HTML::TreeBuilder::XPath->new_from_content($mech->content);
sub test
{
use HTML::TreeBuilder::XPath;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码编译,因此该use语句在sub全球范围内应用.
为什么这样perl做?它没有任何意义.
perl ×10
perl-module ×10
module ×3
oop ×3
cpan ×2
activestate ×1
autoload ×1
dist-zilla ×1
distribution ×1
inheritance ×1
installer ×1
package ×1
scope ×1
windows ×1
xs ×1