标签: perl-module

如何在不丢失模块的情况下在Windows上更新Perl?

在工作中我在Windows上使用Perl 5.8.0.

当我第一次打开Perl时,我去了CPAN,下载了所有的源代码,做了一些更改(在.MAK文件中?支持线程,或类似的东西),并做了nmake/nmake test/nmake install.然后,我一点一点地从CPAN下载了各个模块并完成了nmake舞蹈.

所以,我想升级到更新版本,但新版本不能破坏任何现有脚本.值得注意的是,我安装的一堆"使用"模块必须安装在新版本中.

什么是最可靠(最简单)的方式来更新我当前的版本,确保我所做的与nmake共舞的所有内容在更新后仍然存在?

windows perl upgrade perl-module

10
推荐指数
2
解决办法
1万
查看次数

Perl构造函数应该返回一个undef或"无效"对象吗?

问题:

什么被认为是"最佳实践" - 以及为什么 - 在构造函数中处理错误?

"最佳实践"可以引自施瓦茨,或50%的CPAN模块使用它等等; 但我对任何人都有充分理由的意见感到高兴,即使它解释了为什么常见的最佳实践并不是真正的最佳方法.

至于我自己对该主题的看法(通过Perl中的软件开发多年来了解),我在perl模块中看到了三种主要的错误处理方法(在我看来从最好到最差列出):

  1. 构造一个对象,设置一个无效的标志(通常是" is_valid"方法).通常通过类的错误处理与设置错误消息相结合.

    优点:

    • 允许标准(与其他方法调用相比)错误处理,因为它允许$obj->errors()在错误的构造函数之后使用类型调用,就像在任何其他方法调用之后一样.

    • 允许传递其他信息(例如> 1错误,警告等...)

    • 允许轻量级的"重做"/"fixme"功能,换句话说,如果构造的对象非常繁重,许多复杂的属性100%总是正常,并且它无效的唯一原因是因为某人输入了不正确的日期,你可以简单地做" $obj->setDate()"而不是再次重新执行整个构造函数的开销.这种模式并不总是需要,但在正确的设计中非常有用.

    缺点:没有我知道的.

  2. 返回" undef".

    缺点:无法实现第一个解决方案的任何优点(全局变量之外的每个对象错误消息和重型对象的轻量级"fixme"功能).

  3. 死在构造函数内部.在一些非常狭窄的边缘情况之外,我个人认为这是一个可怕的选择,有太多理由列出这个问题的边缘.

  4. 更新:为了清楚,我认为(非常有价值和一个伟大的设计)解决方案有一个非常简单的构造函数,它根本不会失败,而且是一个繁重的初始化方法,其中所有错误检查都只是其中任何一个的子集出于此问题的目的,情况#1(如果初始化程序设置错误标志)或情况#3(如果初始化程序死亡).显然,选择这样的设计,你会自动拒绝选项#2.

error-handling perl exception-handling perl-module

10
推荐指数
3
解决办法
2749
查看次数

Perl,如何确定变量值是否为数字?

是否有一种独特的方法来确定变量值是否为数字,因为这些值也可以是科学记数法(例如,5.814e-10)?

regex perl numbers perl-module

10
推荐指数
3
解决办法
2万
查看次数

Linux:如何安装DBD :: Pg模块?

已经安装了Postgres DB.我没有使用系统perl我在"/ srv/data203806/Migration/CPAN/localperl/bin"中安装了另一个perl.当我尝试安装时,它要求PATH TO pg_config:

[root1@frmrszvwb023 bin]# ./cpan install DBD::Pg
Reading '/root/.cpan/Metadata'
  Database was generated on Fri, 07 Mar 2014 03:53:02 GMT
Running install for module 'DBD::Pg'
Running make for T/TU/TURNSTEP/DBD-Pg-3.0.0.tar.gz
Checksum for /root/.cpan/sources/authors/id/T/TU/TURNSTEP/DBD-Pg-3.0.0.tar.gz ok

  CPAN.pm: Building T/TU/TURNSTEP/DBD-Pg-3.0.0.tar.gz

    Configuring DBD::Pg 3.0.0
    Path to pg_config?
    No POSTGRES_HOME defined, cannot find automatically
    Warning: No success on command[/srv/data203806/MUXmh-Migration/CPAN/localperl/bin/perl Makefile.PL]
    'YAML' not installed, will not store persistent state
      TURNSTEP/DBD-Pg-3.0.0.tar.gz
      /srv/data203806/MUXmh-Migration/CPAN/localperl/bin/perl Makefile.PL -- NOT OK
    Running make test
      Make had some problems, won't test
    Running …
Run Code Online (Sandbox Code Playgroud)

postgresql perl perl-module dbd-pg

10
推荐指数
6
解决办法
3万
查看次数

为Perl模块提供信誉

我为我的公司编写了一个脚本,我正在使用从CPAN获得的一些库.我的经理希望我整合并删除额外的库 - 这有点好笑,因为我将它们包含在脚本中.

几点说明:

  • 我在此服务器上没有root访问权限,也无法请求访问权限
  • 要使用没有root的CPAN模块,我将它们安装到我的用户目录中
  • 为了让其他用户能够运行我的脚本,我通常会在我的脚本目录和脚本中包含一个名为"libs"的文件夹:use 'libs';use我的CPAN模块之前的顶部.

我现在唯一的解决方案就是将perl模块的内容直接放在perl脚本中.不过,我想给信贷,这是由于,也陷入困境无法获得包括开源代码的w/o适当的信贷,以它的作者和组织.

因此,我应该怎么做呢?我并不是想逃避任何事情......我真的想以正确的方式去做.

所有这三个模块都说"以与Perl本身相同的条件获得许可",但我觉得它应该不那么容易.

我也想探索其他任何想法!

这些模块是:

  • 文字::表
  • 文字::定位仪
  • 期限:: ANSIColor

perl cpan gnu perl-module

10
推荐指数
1
解决办法
205
查看次数

有没有办法用更好的东西替换Perl中的if-elsif-else?

我想构建一堆Perl子程序,它们都具有相同的模板if elsif elsif else,可以根据因子变量做出决定.这是子程序模板的一个例子:

sub get_age{

  my $factor=shift;

  if    ($factor == 1 ){ print "do something" }
  elsif ($factor == 2 ){ print "do somthing2" }
  elsif ($factor == 3 ){ print "do somthing3" }
  elsif ($factor == 4 ){ print "do somthing4" }
  else                 { print "error"        }
  }
Run Code Online (Sandbox Code Playgroud)

我想知道在Perl上是否有一些设计模式if else用更优雅的解决方案替换条件,如果我需要更改某些条件或删除其中某些条件,将来是否容易维护?

perl design-patterns perl-module perl-data-structures

9
推荐指数
2
解决办法
961
查看次数

分发中的每个Perl模块是否都需要具有版本号?

我正在维护一个包含超过100个.pm文件的CPAN发行版.他们每个人都需要有一个$ VERSION,还是可以将它包含在主模块中?

对于发行版中的其他模块,包括或不包括$ VERSION有什么影响?

如果它与问题相关,那么人们应该只是"使用" - 这个分布中的主要模块.并且,出于这个问题的目的,我不是在询问它应该如何在任何文件中指定,只是它是否以任何形式存在.

perl cpan perl-module

9
推荐指数
1
解决办法
186
查看次数

无法在/usC/share/perl/5.14/CPAN/FirstTime.pm找到@INC中的local/lib.pm

我试图在我的系统上第一次使用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 perl-module ubuntu-12.04

9
推荐指数
1
解决办法
4万
查看次数

我可以使用模块,稍后卸载它会缩小optree吗?

免责声明我不确定我是否使用了正确的条款.它可能不是负责下面提到的膨胀的选择:它可能DynaLoader是未加载的符号.

是否可以使用模块,例如POSIX.pm,卸载它并减少(缩小或修剪)optree

  1. Rexecing perl
  2. 分叉

我试过的事情,

  1. Class::Unload->unload('POSIX');
  2. Symbol::delete_package('POSIX');
  3. no POSIX;

这是一个简单的测试创建文件test.pl

$|++;
use Symbol;
use Class::Unload;
use POSIX;

print "GOT POSIX";
sleep(3);

no POSIX;
Class::Unload->unload('POSIX');
Symbol::delete_package('POSIX');
print "unloaded";

sleep(3);
Run Code Online (Sandbox Code Playgroud)

Shell命令

perl ./test.pl & watch -n1 'ps -C perl -o "cmd rss";'
Run Code Online (Sandbox Code Playgroud)

您可能会或可能不会看到RSS大小增加(POSIX可能在watch生成之前加载ps).但是,我希望看到它缩小.

追踪POSIX.pm我看到它究竟使用XSLoader哪种用途DynaLoader.

做一些快速比较检查/proc/$$/smaps我已经确定使用POSIX.pm会导致堆分配,代表空间的差异.使用POSIX.pm时,堆上的第一个分配大大增加:

56122fe4c000-561230040000 rw-p 00000000 00:00 0                          [heap]
Size:               2000 kB
Rss:                1956 kB
Pss:                1956 kB
Shared_Clean:          0 kB
Shared_Dirty: …
Run Code Online (Sandbox Code Playgroud)

perl memory-management perl-module shared-libraries xs

9
推荐指数
2
解决办法
611
查看次数

为什么Perl在使用bigint时警告"无用常数1"?

当我注意到语法检查结果警告无用的常量(1)时,我正在编写一个模块作为我的应用程序的一部分.这是为什么?

常量是1模块末尾的强制性,通常会被警告忽略,如下所示perldoc perldiag:

对于等于0或1的数值常量,不会发出此警告,因为它们通常用在类似的语句中

1 while sub_with_side_effects();
Run Code Online (Sandbox Code Playgroud)

(可能有一个更好的来源.毕竟1在文件的最后是完全需要的,不要被警告.)

但是,即使对于几乎空的模块,也会产生警告use bigint.

package Foo;

use bigint;

1;
Run Code Online (Sandbox Code Playgroud)

对于这个简单的文件语法检查,会产生以下警告:

$> perl -Wc Foo.pm
Useless use of a constant (1) in void context at Foo.pm line 5.
Foo.pm syntax OK
Run Code Online (Sandbox Code Playgroud)

bigint除了在sqlite中输入长十六进制数字之外,我找不到任何引用和警告消息,但我认为这并没有真正解决我的问题.

我的Perl是Cygwin的v5.14.4,bigint是0.36.

perl perl-module bigint perlsyn

8
推荐指数
2
解决办法
293
查看次数