谢 @KE meng邀。不过Python这东西我不熟,所以不太好说太细节的比较。
从我对Python的少量了解来看,Perl大概有这么几个优势:性能稍微好一点,不过十分不显著。而且Perl的Moose对象系统会造成10%左右的性能损失。如果你用Perl构建比较复杂的系统,使用了Moose,那对Python的性能优势应当会被抹回去。
Perl的灵活程度据说比Python要高。
Python用缩进代替花括号作为代码段的标识,有时很坑爹。Perl那种类C的语法会比较容易掌握,也更不容易出错。
不过,其实Perl有几个颇为显著的缺陷:它的内置功能变量使用单字符名,比如$_、$?、$!、$0、$&、$^等等,不利于新手记忆。
Perl的C API非常之坑爹,它是一大坨由宏、自制语言和代码生成器组成的不可名状之物,封装混乱(看起来像是把Perl interpreter内部使用的东西塞给你),文档模糊不清,而且会把干一件事情的逻辑分散在几个离得很远的文件里。我花了很多精力在文档、论坛、博客里面,才弄明白这套玩意的工作逻辑。与之相比,Python的C API我虽然只是大致看过一下,但看起来更符合正常人对一个API的期望。
Perl的模块数量更多,但质量有点坑爹,充分体现了“卧槽这个轮子好烂,看我来造个更烂的”。特别是图表绘制的模块,得有七八个,但就没一个特别好用的。
======想到啥就补充上=====
Perl的变量有个特点,带标识前缀。这样语言就可以设计为允许直接嵌入字符串表达式。比如:
my $value = 123;
say "value is $value";
要是Python,那就必须format:
value = 123
# 旧式的
print "value is %d" % (value)
# 新式的
print "value is {}".format(value)
前者比较清晰。同时,如果需要精细控制,Perl有同样的能力:
my $value = 123;
say sprintf "value is %d", $value;
==== 继续补充 ====
Perl的正则是“嵌入”到语言里的,为正则设计了专门的关键字、操作符、变量,敲起来会比使用名字空间里的东西更快。比如
my $var = "deep_dark_fantasy";
if ($var =~ /(.*)_dark_(.*)/)
{
# 会得到 "my name is Van: deep dark fantasy"
say "my name is Van: $1 dark $2";
}
Perl原生的对象系统是裸奔的:实质上只提供了动态语言最基本的对象概念,将数据绑定到名字空间里,名字空间中的函数就是对象方法。不过Moose系统提供了比较高级的成员、变量、构造器语义:
package PhilosophyGladiator;
use Moose;
has 'name' => (
is => 'ro', # 只读属性
isa => 'Str', # 运行时类型检查,是字符串
default => 'Van', # 默认值
);
sub self_describe
{
my $self = shift;
print "my name is ", $self->name, ".\n";
print "I'm an artist, a performance artist\n" if $self->name eq 'Van';
}