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有更多的运算符 ,包括匹配 ( =~!~ ), 引用 ( qwqx &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%foovariables。
  • (与前一点相关)Perl为标量,数组,散列,代码,文件/目录句柄和格式分别提供了符号表条目。 每个都有自己的名字空间。
  • Perl提供了对符号表的访问,尽pipe操纵它并不是因为心里暗淡。 在PHP中,符号表操作仅限于创build引用和extractfunction。
  • 请注意,“引用”在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有特殊的代码块 ( BEGINUNITCHECKCHECKINITEND )被执行。 与PHP的auto_prepend_fileauto_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 @ISAvariablesdynamic更改inheritance。
  • Perl支持运算符重载 。
  • 严格来说,Perl没有多行注释,但POD系统可以用于相同的影响。
  • 在Perl中, //是一个运算符。 在PHP中,这是一个单行注释的开始。
  • 在PHP 5.3之前,PHP对匿名函数( create_function函数)的支持create_function ,不支持闭包。
  • 直到版本5.3引入了命名空间之前,PHP没有像Perl的包一样。
  • 可以说,Perl对exception的内置支持看起来几乎不像其他语言中的exception,所以它们几乎看起来像是例外。 你评估一个块并检查$@的值( eval而不是trydie而不是throw )。 Error Try :: Tiny模块支持exception,因为您可以在其他语言中find它们(以及Error's See Also部分中列出的一些其他模块)。

PHP的灵感来自Perl,就像“天堂幻影”的灵感来源于“ 歌剧魅影” ,或者“ 奇怪的酿造”是受哈姆雷特启发的。 学习Perl的时候,最好把PHP的行为细节放在脑海中,否则你会被绊倒。

我的大脑现在很痛,所以我会停下来。

当PHP来到现场时,每个人都对Perl的主要区别印象深刻:

  1. inputvariables已经在全局范围内,没有无聊的parsing。
  2. HTMLembedded。 只要<?php ... ?>在任何地方。 没有无聊的模板。
  3. 屏幕上的错误消息。 没有无聊的错误日志窥视。
  4. 简单易学。 没有无聊的书阅读。

随着时间的推移,每个人都知道他们不是一个好处,嘿嘿…

我注意到,大多数PHP与Perl页面似乎是

PHP比Perl好,因为这里插入了蹩脚的理由

而且很less进行合理的比较。

在语法上,你会发现PHP通常比Perl更容易理解,特别是当你没有什么经验的时候。 例如,在PHP中修剪一个前导和尾随空白string是简单的

 $string = trim($string); 

在Perl中,它有点神秘

 $string =~ s/^\s+//; $string =~ s/\s+$//; 

(我相信这比单行捕获和replace稍微有效一些,但也更容易理解)。但是,尽pipePHP通常更像英语,但它有时仍然performance为低级C的包装,例如, strpbrkstrspn可能很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,你必须使用ltgteqnecmp (前面列出的操作符的相应等价物)。 例如,这将真正让你:

 if ("a" == "b") { ... } # This is true. if ("a" == 0) { ... } # This is also true, for the same reason. 

我不需要添加任何东西的出色的答案,我只想为你显示答案的问题:

为什么Perl不再经常用于dynamic网站? 是什么让PHP比它更受欢迎?

请首先检查一下“工作趋势”网站 – 您可以单独作出判断。

正如你所看到的,perl仍然是一个领导者 – 但是对于真正的应用程序而言,不适用于玩具。 🙂