Perl 5按从最讨厌到最不讨厌的顺序。
1.)向后兼容警察。是的,backcompat 是一种优势,但 Perl 5 太过分了。现在,我们甚至没有在我们的语言中获得新功能,而无需显式启用它们。我更喜欢相反的情况,如果新功能导致问题,让我禁用它或强制执行旧行为。例如 perl 5.10 添加了如果我有自己的实现,say
我宁愿拥有,而不是必须放置,或者
如果 5.8 工作但 5.10 没有。我宁愿将我的代码限制为仅使用 5.8 及以下可用的功能,如果没有定义,那么它应该默认为您正在运行的任何版本,并且建议不要限制它,除非您必须这样做。no feature 'say'
say
use feature 'say';
use 5.010;
use 5.008;
use version;
2.)过多的样板。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use autodie;
use English '-no_match_vars';
use 5.010;
package Package::Name;
BEGIN {
Package::Name::VERSION = 0.1;
}
sub somesub {
my $self = shift;
my ( $param1, $param2 ) = @_;
}
1;
现在你可以开始编码了。由于#1,这不会改变。当然,这些东西有一些捷径,比如use common::sense;
或use modern::perl;
会缩短上面的内容,你可能需要一些稍微不同的模块或编译指示。但是由于#1,我们永远无法将其减少到。
#!/usr/bin/perl
package Package::Name 0.01;
sub somesub ( $param1, $param2 ) {
}
一些模块正在帮助解决这个问题,5.0.12 中有新的包版本,虽然我认为它use 5.012;
首先需要它,Method::Signatures
但它永远不会完全解决(用语言)。
3.)变量选择不佳
啜食一个文件
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, "< foo" or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;
wtf 是$!
和$/
?重写为易读。
#!/usr/bin/perl
use strict;
use warnings;
use English '-no_match_vars';
open my $fh, "< foo" or die $ERRNO;
local $INPUT_RECORD_SEPARATOR; # enable localized slurp mode
my $content = <$fh>;
close $fh;
并且不要忘记'-no_match_vars'
如果您不想受到性能影响,则必须存在。
没有直接的方法来创建匿名标量怎么办?
#!/usr/bin/perl
my $scalar_ref = \do{ my $anon_scalar };
他们就不能想出点什么吗?
#!/usr/bin/perl
my $scalar_ref = <>;
哦,perl 是如何对线程不友好的,因为默认情况下所有变量(包括特殊变量)都是全局的。至少现在您可以将my $_;
其用于词法范围并用于local
其他范围。
4.)非常丑陋的语法
MooseX::Declare 是一种更好的语法。我也希望 -> 被替换为 . (个人喜好无关紧要)
5.) TIMTOWTDI过多或最佳实践过多似乎您必须阅读 3-5 本书才能弄清楚您应该如何做事。
6.) 以前的(不再适用)。不理智的发布。5.10.0 的功能 5.10.1 的功能没有设定时间,直到下一个版本。现在它是每年一次的功能发布,每季度更新一次。
7.)象牙塔视角。社区问题,似乎是大量开发人员想要高准入门槛,并认为可以不尊重地对待n00bs(或实际上任何不同意他们的人)。
8.)疯狂的版本号/字符串Perl 有浮点版本号,而且它们很丑。哦,开发人员不知道并非所有下游都以相同的方式处理版本比较。不是语言问题
0.012 # simple
5.012001 # semantic
4.101900 # time based + version (for multiple versions in a day)
0.035_002 # prerelease
perl 中的所有有效版本..我们不能像这样使用...
0.12 # simple
5.12.1 # semantic
20100713 # time based (just use the date and be careful not to need to release more than 1 a day)
0.35-beta2 # prerelease
添加
9.)升级后没有明显的方法来重新安装所有 XS 模块