Perl和PHP的区别
我打算学习Perl 5,因为我到目前为止只使用了PHP,所以我想知道一些关于这些语言的不同之处。
由于PHP最初是一组“Perl黑客”,它显然克隆了一些Perl的特性。
-
语法的主要区别是什么? 对于Perl来说,是否有更多的select和方式来expression某些东西?
-
为什么Perl不再经常用于dynamic网站? 是什么让PHP越来越受欢迎?
Perl和PHP比起来更加不同。 让我们考虑一下Perl 5,因为Perl 6还在开发中。 有些差异,主要按主题分组:
- Perl具有原生的正则expression式支持,包括正则expression式文字。 PHP使用Perl的正则expression式函数作为扩展。
- Perl有更多的运算符 ,包括匹配 (
=~
,!~
), 引用 (qw
,qx
&c), 指数 (**
), string重复 (x
)和范围 (..
和...
) 。 PHP有几个运算符Perl,例如错误抑制运算符 (@
),instanceof
(尽pipePerl有Universal ::isa
方法)和clone
。 - 在PHP中,
new
是一个操作符。 在Perl中,它是在包中定义的对象创build子例程的常规名称,就语言而言没有什么特别之处。 -
Perl逻辑运算符返回它们的参数,而它们在PHP中返回布尔值 。 尝试:
$foo = '' || 'bar';
在每种语言。 在Perl中,如果尚未设置
$foo ||= 'default'
可以将$ foo设置为一个值。 在PHP中这样做的最简单的方法是$foo = isset($foo) ? $foo : 'default';
$foo = isset($foo) ? $foo : 'default';
(更新,在PHP 7.0中,你可以做$foo = $foo ?? 'default'
) - Perl variables名称表示内置types,其中Perl有三个,types说明符是名称的一部分(称为“ sigil ”),所以
$foo
是一个不同于@foo
或%foo
variables。 - (与前一点相关)Perl为标量,数组,散列,代码,文件/目录句柄和格式分别提供了符号表条目。 每个都有自己的名字空间。
- Perl提供了对符号表的访问,尽pipe操纵它并不是因为心里暗淡。 在PHP中,符号表操作仅限于创build引用和
extract
function。 - 请注意,“引用”在PHP和Perl中有不同的含义。 在PHP中, 引用是符号表别名。 在Perl中, 引用是智能指针。
- 对于整数索引集合(数组)和string索引集合(散列),Perl有不同的types。 在PHP中,它们是相同的types: 关联数组/有序地图 。
- Perl数组并不稀疏:设置索引大于数组当前大小的元素会将所有中间元素设置为
undefined
(请参阅perldata )。 PHP数组很稀疏; 设置元素不会设置中介元素。 - Perl本地支持哈希和数组切片 ,切片是可分配的,具有各种用途 。 在PHP中,你使用
array_slice
来提取一个slice和array_splice
来分配一个slice。 - 您可以在PHP中使用下标运算符的参数,这有点神奇。 在Perl中,你不能忽略下标。
- Perl散列是无序的 。
- Perl有大量的预定义和魔术variables 。 PHP的预定义variables具有完全不同的目的。
- Perl有语句修饰符 :一些控制语句可以放在语句的末尾。
- Perl通过
local
关键字支持dynamic范围 。 - 另外,Perl具有全局,词法(块)和包范围 。 PHP具有全局,函数,对象,类和命名空间范围 。
- 在Perl中,默认情况下variables是全局的。 在PHP中,函数中的variables默认是本地的。
- Perl通过
goto
函数支持显式尾部调用 。 - Perl的原型为函数参数提供了比PHP types提示更有限的types检查。 因此,原型的功用比提示更有限。
- 在Perl中,如果语句是一个expression式(即它有一个值),则最后一个被评估语句作为子例程的值返回,即使没有使用return语句也是如此。 如果最后一条语句不是一个expression式(即没有值),例如循环,则返回值是未指定的(请参阅perlsub )。 在PHP中,如果没有显式返回,则返回值为NULL 。
-
Perl将列表展平(参见perlsub ); 对于未拼合的数据结构,请使用引用。
@foo = qw(bar baz); @qux = ('qux', @foo, 'quux'); # @qux is an array containing 4 strings @bam = ('bug-AWWK!', \@foo, 'fum'); # @bam contains 3 elements: two strings and a array ref
PHP不会压扁数组。
- Perl有特殊的代码块 (
BEGIN
,UNITCHECK
,CHECK
,INIT
和END
)被执行。 与PHP的auto_prepend_file
和auto_append_file
不同,每种代码块的数量没有限制。 此外,代码块在脚本中定义,而PHP选项在服务器和每个目录的configuration文件中设置。 - 在Perl中,分号分隔语句 。 在PHP中,它终止它们,除了一个PHPclosures标签(“?>”)也可以终止一个语句。
- Perl中expression式的值是上下文敏感的 。
- Perl中的负下标相对于数组的末尾。
$bam[-1]
是数组的最后一个元素。 PHP中的负下标与其他任何下标一样。 - 在Perl 5中,类是基于包而不是像PHP(或其他大多数语言)中的类。 Perl 6类更接近于PHP类,但仍然完全不同。 (在很多其他方面,Perl 6与Perl 5是不同的 ,但这不是主题。)Perl 5和PHP之间的许多差异源自这样一个事实,即大多数OOfunction不是内置于Perl,而是基于黑客。 例如,
$obj->method(@args)
被转换成类似(ref $obj)::method($obj, @args)
。 非详尽清单:- PHP自动在方法中提供特殊variables
$this
。 Perl将对象的引用作为方法的第一个parameter passing给对象。 - Perl需要引用来祝福创build一个对象。 任何引用都可以作为给定类的一个实例来祝福。
- 在Perl中,您可以通过packages
@ISA
variablesdynamic更改inheritance。
- PHP自动在方法中提供特殊variables
- Perl支持运算符重载 。
- 严格来说,Perl没有多行注释,但POD系统可以用于相同的影响。
- 在Perl中,
//
是一个运算符。 在PHP中,这是一个单行注释的开始。 - 在PHP 5.3之前,PHP对匿名函数(
create_function
函数)的支持create_function
,不支持闭包。 - 直到版本5.3引入了命名空间之前,PHP没有像Perl的包一样。
- 可以说,Perl对exception的内置支持看起来几乎不像其他语言中的exception,所以它们几乎看起来像是例外。 你评估一个块并检查
$@
的值(eval
而不是try
,die
而不是throw
)。ErrorTry :: Tiny模块支持exception,因为您可以在其他语言中find它们(以及Error's See Also部分中列出的一些其他模块)。
PHP的灵感来自Perl,就像“天堂幻影”的灵感来源于“ 歌剧魅影” ,或者“ 奇怪的酿造”是受哈姆雷特启发的。 学习Perl的时候,最好把PHP的行为细节放在脑海中,否则你会被绊倒。
我的大脑现在很痛,所以我会停下来。
当PHP来到现场时,每个人都对Perl的主要区别印象深刻:
- inputvariables已经在全局范围内,没有无聊的parsing。
- HTMLembedded。 只要
<?php ... ?>
在任何地方。 没有无聊的模板。 - 屏幕上的错误消息。 没有无聊的错误日志窥视。
- 简单易学。 没有无聊的书阅读。
随着时间的推移,每个人都知道他们不是一个好处,嘿嘿…
我注意到,大多数PHP与Perl页面似乎是
PHP比Perl好,因为这里插入了蹩脚的理由
而且很less进行合理的比较。
在语法上,你会发现PHP通常比Perl更容易理解,特别是当你没有什么经验的时候。 例如,在PHP中修剪一个前导和尾随空白string是简单的
$string = trim($string);
在Perl中,它有点神秘
$string =~ s/^\s+//; $string =~ s/\s+$//;
(我相信这比单行捕获和replace稍微有效一些,但也更容易理解)。但是,尽pipePHP通常更像英语,但它有时仍然performance为低级C的包装,例如, strpbrk
和strspn
可能很less被使用,因为大多数PHP的抄袭者编写他们自己的等效函数,对于任何太深奥的东西,而不是花时间去探索手册。 我也想知道程序员的英语是第二语言,因为每个人都像Perl一样处于平等地位,必须从头开始学习。
我已经提到了手册。 PHP有一个很好的在线手册,不幸的是它需要它。 我仍然不时地提到它应该是简单的东西,例如参数或函数命名约定的顺序。 有了Perl,你可能会发现你在开始的时候会提到很多手册,然后有一天,你将会有一段时间,而不再需要它。 那么,至less不要等到你更高级,认识到不仅有不止一种方式,还有更好的方法,别人可能已经做得更好了,也许你应该去参观CPAN。
Perl确实有更多的select和方法来expression事物。 这不一定是好事,但是如果明智地使用代码并且至less有一种方法可能会被熟悉的话,代码将变得更加可读。 有一些你会发现自己陷入的风格和习惯用法,我可以衷心推荐阅读Perl最佳实践 (早晚),以及Perl Cookbook第二版 ,以加快解决常见问题的速度。
我相信Perl在共享主机环境中使用较less的原因在于,由于安全性和configuration问题,CGI的缓慢感和主机不愿意安装mod_perl使PHP成为一个更有吸引力的select。 然后循环继续,更多的人学会使用PHP,因为更多的主机提供它,更多的主机提供它,因为这是人们想要使用的。 FastCGI现在对速度差异和安全问题提出了质疑 ,在大多数情况下,PHP也会在FastCGI中运行,而不是将其放在Web服务器的核心中。
无论是这种情况还是其他原因,PHP变得stream行起来,并且有大量的应用程序被写入其中。 对于大多数只需要一个简单的博客或图片库的入门级网站的人来说,PHP就是他们需要的东西,所以这就是主机所提倡的。 如果你愿意的话,不应该阻止你使用Perl(或者你select的其他东西)。
在企业层面上,我怀疑你会发现生产中有太多的PHP(请指出,没有人指出Facebook作为反例,我说的是企业级)。
Perl被广泛用于网站,比如Python和Ruby。 也就是说,PHP的使用方式比任何一个更频繁。 我认为最重要的因素是PHP的易于部署和轻松入门。
语法上的差异太多了,不足以概括在这里,但通常确实有更多的方式来expression自己(这就是所谓的TIMTWOTDI,有不止一种方法去做)。
我最喜欢的是Perl处理数组/列表的方式。 下面是一个如何创build和使用Perl函数(或“子例程”)的例子,它使用了这个参数:
sub multiply { my ($arg1, $arg2) = @_; # @_ is the array of arguments return $arg1 * $arg2; }
在PHP中,你可以用list()
做类似的事情,但是不完全相同。 在Perl中,列表和数组实际上是相同的(通常)。 你也可以做这样的事情:
$week_day_name = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")[$week_day_index];
另一个你必须知道的区别是数字/string比较运算符。 在Perl中,如果使用<
, >
, ==
, !=
, <=>
!=
>
等,Perl会将这两个操作数转换为数字。 如果你想转换为string,你必须使用lt
, gt
, eq
, ne
, cmp
(前面列出的操作符的相应等价物)。 例如,这将真正让你:
if ("a" == "b") { ... } # This is true. if ("a" == 0) { ... } # This is also true, for the same reason.
我不需要添加任何东西的出色的答案,我只想为你显示答案的问题:
为什么Perl不再经常用于dynamic网站? 是什么让PHP比它更受欢迎?
请首先检查一下“工作趋势”网站 – 您可以单独作出判断。
正如你所看到的,perl仍然是一个领导者 – 但是对于真正的应用程序而言,不适用于玩具。 🙂