如何判断机器上特定Perl安装最初提供的模块?
(这不是重复: 如何判断Perl模块是核心还是标准安装的一部分? ("我怎么知道Perl模块是核心还是标准安装的一部分?") - 它在事实上是一个衍生问题)
我正在寻找最初安装的内容,作为安装的一部分提供了哪些模块,内置的内容.不是从那以后安装的.
我希望这适用于任何 Perl版本.
我希望能够这样做:
我想这样做的原因是:
我之所以提出这个问题,是因为,对于任何Perl版本,似乎没有一种自动方式来查找整体标准安装,从而定义您的机器上的默认安装中可能存在哪些模块 - 请参阅问题: 如何判断Perl模块是核心还是标准安装的一部分? ("如何判断Perl模块是核心还是标准安装的一部分?")
不能依赖Perl版本来告诉您哪些模块存在与否.当然,可能有在线文档告诉你.但是我需要在我下载/安装的版本上自动执行此操作.即使是不同Linux/Unix发行版上的相同Perl版本也可能不同.
我想知道Perl的最佳实践是关于获取 - 或者更重要的是设置 - 某个模块的全局变量,通过直接访问$Module::varName以防模块没有为它提供getter/setter方法.
它闻起来不好的原因是它有点绕过封装.仅仅因为我可以在Perl中完成它,我不完全确定我应该(假设实际上有一个替代方法,比如在模块中添加一个getter/setter).
我正在使用Term::ANSIColor我的Perl脚本对终端输出进行着色,并且我正在使用该colorstrip函数,该函数仅在Term::ANSIColor版本2.01中添加,根据更改日志.那么,有没有办法让我的脚本自动die使用适当的错误消息,如果它至少找不到该版本的Term::ANSIcolor?
如果我错了,请纠正我,但基于XS和Dynaloader的模块是那些使用C/C++共享对象(.so)而不是PP(Pure Perl)的模块?
现在假设我有一台机器,它没有任何网络连接(Solaris 10),我想要安装Crypt::OpenSSL::AES(基于XS的模块),将AES.pm文件复制到@INC中的相关路径不会有任何好处,因为我的系统没有libssl安装.
我的第二个也是最重要的问题是,当我没有CPAN时如何安装这些模块?我的方法是:
libssl我的平台,编译它,但我应该在哪里放置该分片对象文件,以便perl可以找到它?AES.pm到@INC中的相关路径,还是需要配置/制作它?我试图找出如何让Perl模块顺从并打开文件句柄的引用.当你看到主程序时,你会理解我的意思:
#!/usr/bin/perl
use strict;
use warnings;
use lib '/usr/local/share/custom_pm';
use Read_FQ;
# open the STDIN filehandle and make a copy of it for (safe handling)
open(FILECOPY, "<&STDIN") or die "Couldn't duplicate STDIN: $!";
# filehandle ref
my $FH_ref = \*FILECOPY;
# pass a reference of the filehandle copy to the module's subroutine
# the value the perl module returns gets stored in $value
my $value = {Read_FQ::read_fq($FH_ref)};
# do something with $value
Run Code Online (Sandbox Code Playgroud)
基本上,我希望主程序通过STDIN接收输入,复制STDIN文件句柄(用于安全处理),然后将对该副本的引用传递给Read_FQ.pm文件(perl模块)中的read_fq()子例程.然后,子例程将从该文件句柄读取输入,处理它并返回一个值.这里是Read_FQ.pm文件:
package Read_FQ;
sub read_fq{
my ($filehandle) = …Run Code Online (Sandbox Code Playgroud) 简而言之,我尝试使用网络中每个实例的对象为网络拓扑建模.另外,我有一个顶级经理类,负责管理这些对象并执行完整性检查.文件结构看起来像这样(我遗漏了大多数对象文件,因为它们的结构都非常相似):
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模块中经常遇到过这一行,但我无法弄清楚这究竟意味着什么.
my ($self, %myInputs) = @_;
Run Code Online (Sandbox Code Playgroud)
请向我解释声明,以便我可以继续.
我有很多perl代码在测试和生产中做了不同的事情,我想将我的代码锁定到CPAN模块的特定版本,以防将来某些版本的某些更改可能会破坏我的代码.
所以我想使用我使用的所有模块的特定版本.用我的意思是
use XML::Smart
Run Code Online (Sandbox Code Playgroud) 我应该只将非核心模块放在Makefile.PL的PREREQ_PM部分中,还是应该将核心模块放在那里?
我们目前在我们的组织中使用5.6版本的perl,以及MySQL和Apache,但现在客户端希望将perl升级到v5.24.
在开始升级之前,必须记住哪些主要变化和关键点?
我冲浪了很多但是从5.6到5.24没有找到任何有趣的东西.
是否可以从这么低的版本升级到高级版本.
perl ×10
perl-module ×10
autoload ×1
coding-style ×1
cpan ×1
deployment ×1
filehandle ×1
inheritance ×1
makefile ×1
mod-perl2 ×1
module ×1
oop ×1
reference ×1
stdin ×1
upgrade ×1
version ×1
xs ×1