在工作中我在Windows上使用Perl 5.8.0.
当我第一次打开Perl时,我去了CPAN,下载了所有的源代码,做了一些更改(在.MAK文件中?支持线程,或类似的东西),并做了nmake/nmake test/nmake install.然后,我一点一点地从CPAN下载了各个模块并完成了nmake舞蹈.
所以,我想升级到更新版本,但新版本不能破坏任何现有脚本.值得注意的是,我安装的一堆"使用"模块必须安装在新版本中.
什么是最可靠(最简单)的方式来更新我当前的版本,确保我所做的与nmake共舞的所有内容在更新后仍然存在?
问题:
什么被认为是"最佳实践" - 以及为什么 - 在构造函数中处理错误?
"最佳实践"可以引自施瓦茨,或50%的CPAN模块使用它等等; 但我对任何人都有充分理由的意见感到高兴,即使它解释了为什么常见的最佳实践并不是真正的最佳方法.
至于我自己对该主题的看法(通过Perl中的软件开发多年来了解),我在perl模块中看到了三种主要的错误处理方法(在我看来从最好到最差列出):
构造一个对象,设置一个无效的标志(通常是" is_valid"方法).通常通过类的错误处理与设置错误消息相结合.
优点:
允许标准(与其他方法调用相比)错误处理,因为它允许$obj->errors()在错误的构造函数之后使用类型调用,就像在任何其他方法调用之后一样.
允许传递其他信息(例如> 1错误,警告等...)
允许轻量级的"重做"/"fixme"功能,换句话说,如果构造的对象非常繁重,许多复杂的属性100%总是正常,并且它无效的唯一原因是因为某人输入了不正确的日期,你可以简单地做" $obj->setDate()"而不是再次重新执行整个构造函数的开销.这种模式并不总是需要,但在正确的设计中非常有用.
缺点:没有我知道的.
返回" undef".
缺点:无法实现第一个解决方案的任何优点(全局变量之外的每个对象错误消息和重型对象的轻量级"fixme"功能).
死在构造函数内部.在一些非常狭窄的边缘情况之外,我个人认为这是一个可怕的选择,有太多理由列出这个问题的边缘.
更新:为了清楚,我认为(非常有价值和一个伟大的设计)解决方案有一个非常简单的构造函数,它根本不会失败,而且是一个繁重的初始化方法,其中所有错误检查都只是其中任何一个的子集出于此问题的目的,情况#1(如果初始化程序设置错误标志)或情况#3(如果初始化程序死亡).显然,选择这样的设计,你会自动拒绝选项#2.
是否有一种独特的方法来确定变量值是否为数字,因为这些值也可以是科学记数法(例如,5.814e-10)?
已经安装了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) 我为我的公司编写了一个脚本,我正在使用从CPAN获得的一些库.我的经理希望我整合并删除额外的库 - 这有点好笑,因为我将它们包含在脚本中.
几点说明:
use 'libs';在use我的CPAN模块之前的顶部.我现在唯一的解决方案就是将perl模块的内容直接放在perl脚本中.不过,我想给信贷,这是由于,也陷入困境无法获得包括开源代码的w/o适当的信贷,以它的作者和组织.
因此,我应该怎么做呢?我并不是想逃避任何事情......我真的想以正确的方式去做.
所有这三个模块都说"以与Perl本身相同的条件获得许可",但我觉得它应该不那么容易.
我也想探索其他任何想法!
这些模块是:
我想构建一堆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用更优雅的解决方案替换条件,如果我需要更改某些条件或删除其中某些条件,将来是否容易维护?
我正在维护一个包含超过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) 免责声明我不确定我是否使用了正确的条款.它可能不是负责下面提到的膨胀的选择:它可能DynaLoader是未加载的符号.
是否可以使用模块,例如POSIX.pm,卸载它并减少(缩小或修剪)optree
我试过的事情,
这是一个简单的测试创建文件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) 当我注意到语法检查结果警告无用的常量(1)时,我正在编写一个模块作为我的应用程序的一部分.这是为什么?
常量是1模块末尾的强制性,通常会被警告忽略,如下所示perldoc perldiag:
对于等于0或1的数值常量,不会发出此警告,因为它们通常用在类似的语句中
Run Code Online (Sandbox Code Playgroud)1 while sub_with_side_effects();
(可能有一个更好的来源.毕竟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 ×10
perl-module ×10
cpan ×3
bigint ×1
dbd-pg ×1
gnu ×1
numbers ×1
perlsyn ×1
postgresql ×1
regex ×1
ubuntu-12.04 ×1
upgrade ×1
windows ×1
xs ×1