标签: perl-module

如何在不安装新Perl的情况下安装或升级最新Perl中的CPAN模块?

我想安装一个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模块的链接.

perl installer cpan distribution perl-module

8
推荐指数
1
解决办法
2141
查看次数

在OOP Perl中调用子例程

在查看我接手的一些代码时,我遇到了这一行:

 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!

oop perl perl-module package

7
推荐指数
2
解决办法
428
查看次数

Perl在安装两个版本的模块时会做什么?

我没有对我的工作遥控盒root权限,所以我使用的描述cpanm和地方:: 11b的组合,在这里安装CPAN模块包装盒上的我的本地目录.使用cpanm,我假设cpanm Module::To::Update会在我的本地库中安装最新版本的模块.

显然,我不需要root权限来使用CPAN升级我的模块,就像我刚刚尝试过的那样,升级过程非常顺利.但是,我仍然很好奇Perl将使用哪个版本的模块:本地版本,还是默认的CPAN版本?或者只使用较新的?

如果这存在于perldoc或Stack Overflow中,我也会很感激.我试过搜索两个,但我找不到它= /

perl cpan perl-module

7
推荐指数
1
解决办法
1362
查看次数

如何手动安装XS模块?

如果我错了,请纠正我,但基于XS和Dynaloader的模块是那些使用C/C++共享对象(.so)而不是PP(Pure Perl)的模块?

现在假设我有一台机器,它没有任何网络连接(Solaris 10),我想要安装Crypt::OpenSSL::AES(基于XS的模块),将AES.pm文件复制到@INC中的相关路径不会有任何好处,因为我的系统没有libssl安装.

我的第二个也是最重要的问题是,当我没有CPAN时如何安装这些模块?我的方法是:

  1. 首先得到libssl我的平台,编译它,但我应该在哪里放置该分片对象文件,以便perl可以找到它?
  2. 当我安装和编译libssl并找到它应该的位置时,现在只需将其复制AES.pm到@INC中的相关路径,还是需要配置/制作它?

perl module perl-module xs

7
推荐指数
2
解决办法
1252
查看次数

Perl:动态模块加载,对象继承和"常见帮助文件"

简而言之,我尝试使用网络中每个实例的对象为网络拓扑建模.另外,我有一个顶级经理类,负责管理这些对象并执行完整性检查.文件结构看起来像这样(我遗漏了大多数对象文件,因为它们的结构都非常相似):

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)

现在有趣的部分:

问题1

如何在不静态输入名称的情况下确保正确加载所有这些对象?根本问题是:如果我require "$_" foreach glob("./Classes/*");得到很多"Subroutine new redefined at"错误.我也打得四处use parent qw(-norequire Object),Module::Find以及其他一些@INC以各种组合的修改,使之短:它没有工作.目前我正在静态导入所有使用过的类,它们会自动导入它们的父类.
基本上我要问的是:(perl-)这样做的正确方法是什么?
高级:能够创建更复杂的文件夹结构(因为会有很多对象)并且仍然具有继承+"自动加载"将非常有帮助

问题2 - 已解决

我如何"分享我的进口"?我用几个图书馆(我自己的,包含了一些辅助功能,LibXML,Scalar::Util等),我想分享他们当中我的对象.(其背后的原因是,我可能需要为所有对象添加另一个公共库,并且很可能会有超过100个对象 - 没有乐趣手动编辑所有这些对象并且使用正则表达式/脚本执行此操作理论上可以工作但是这似乎不是最干净的解决方案)
我尝试了什么:

  • 导入所有内容Manager.pm- >在Manager包中的Works - 给我一些错误,如"未定义的子程序和Switch :: …

oop perl inheritance perl-module autoload

7
推荐指数
1
解决办法
1303
查看次数

在Perl中是否有运行时的实际派生类?

我正在研究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)

oop perl perl-module activestate

7
推荐指数
1
解决办法
155
查看次数

Perl:使用Module @list

有人想在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)

perl perl-module

7
推荐指数
1
解决办法
578
查看次数

程序启动后确定加载的模块

我有一个分叉服务器.我在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)

我没有想法,但在我花更多时间在这之前,我想知道是否有现有的解决方案.

perl module perl-module

7
推荐指数
1
解决办法
143
查看次数

Perl模块 - dist.ini和特定于平台的先决条件

如何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安装正确的先决条件?

windows perl perl-module dist-zilla

7
推荐指数
1
解决办法
158
查看次数

为什么sub中的use语句适用于全局?

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 scope module perl-module

7
推荐指数
2
解决办法
100
查看次数