由于PHP开始是一组“Perl hacks”,它显然克隆了一些Perls功能。
>语法的主要区别是什么?是真的,与Perl你有更多的选择和方式来表达什么?
>为什么Perl不再经常用于动态网站?什么使PHP得到更多的人气?
解决方法
> Perl具有原生的正则表达式支持,包括regexp文字。 PHP使用Perl的regexp函数作为扩展。
> Perl有更多的operators,包括matching(=〜,!〜),quote-like(qw,qx& c。),exponentiation(**),string repetition(x)和range 。 PHP有几个操作符Perl不,例如error suppression operator(@),instanceof
(虽然Perl有Universal :: isa方法)和clone
。
>在PHP中,new
是一个运算符。在Perl中,它是在包中定义的object creation subroutine的常规名称,就语言而言没有什么特别。
> Perl逻辑运算符返回它们的参数,而他们在PHP中为return booleans。尝试:
$foo = '' || 'bar';
在每种语言。在Perl中,你甚至可以通过$ foo || =’default’将$ foo设置为一个值,如果它还没有设置。在PHP中最简单的做法是$ foo = isset($ foo)? $ foo:’default’;
> Perl variable names指示内置类型,其中Perl有三个,类型说明符是名称(称为“sigil”)的一部分,因此$ foo是与@foo或%foo不同的变量。
>(与上一点相关)Perl具有用于标量,数组,散列,代码,文件/目录句柄和格式的单独的symbol table条目。每个都有自己的命名空间。
> Perl允许访问symbol table,虽然操纵它不是为了微弱的心脏。在PHP中,符号表操作仅限于创建references和extract
函数。
>请注意,“引用”在PHP和Perl中有不同的含义。在PHP中,references是符号表别名。在Perl,references是智能指针。
> Perl对整型索引集合(数组)和字符串索引集合(散列)有不同的类型。在PHP中,它们是相同的类型:一个associative array/ordered map。
> Perl数组不稀疏:设置索引大于数组当前大小的元素会将所有中间元素设置为undefined(见perldata)。 PHP数组稀疏;设置元素不会设置中间元素。
> Perl支持哈希和数组slices本地,切片是可分配的,它有各种各样的uses.在PHP中,您使用array_slice
提取切片和array_splice
分配给切片。
>你可以离开argument to the subscript operator在PHP中的一点魔法。在Perl中,你不能省略下标。
> Perl hashes是unordered。
> Perl有大量的predefined and magic variables.PHP的predefined variables有不同的目的。
> Perl has statement modifiers:一些控制语句可以放在语句的结尾。
> Perl通过本地关键字支持dynamic scoping。
>此外,Perl具有全局,词法(块)和包scope. PHP具有全局,函数,对象,类和命名空间scope。
>在Perl中,默认情况下变量是全局变量。在PHP中,函数中的变量默认是本地的。
> Perl通过goto
函数支持显式tail calls。
> Perl的prototypes比PHP的type hinting提供了更有限的函数参数的类型检查。因此,原型比类型提示更有限的实用性。
>在Perl中,如果语句是一个表达式(即它有一个值),即使不使用return语句,最后一个求值的语句也会作为子程序的值返回。如果最后一个语句不是表达式(即没有值),例如循环,则返回值未指定(参见perlsub)。在PHP中,如果没有明确的返回,return value is NULL。
> Perl flattens lists(见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有special code blocks(BEGIN,UNITCHECK,CHECK,INIT和END)被执行。与PHP的auto_prepend_file
和auto_append_file
不同,每种类型的代码块的数量没有限制。此外,代码块在脚本中定义,而PHP选项在服务器和每个目录配置文件中设置。
>在Perl中,分号separates statements.在PHP中,它是terminates它们,除了一个PHP关闭标签(“?>”)也可以终止语句。
> Perl中的表达式的值为context sensitive。
> Perl中的负下标是相对于数组的结尾。 $ bam [-1]是数组的最后一个元素。 PHP中的负下标与任何其他下标一样。
>在Perl 5中,类基于包,而不像PHP(或大多数其他语言)中的类。 Perl 6类更接近PHP类,但仍然有很大的不同。 (Perl 6是来自Perl 5的different在许多其他方面,但是这是主题)。Perl 5和PHP之间的许多差异是由于大多数OO功能不内置到Perl,但基于黑客。例如,$ obj->方法(@args)被转换为(ref $ obj):: method($ obj,@args)。非详尽列表:
> PHP在方法中自动提供特殊变量$ this。 Perl传递对对象的引用作为方法的第一个参数。
> Perl要求引用为blessed来创建一个对象。任何引用都可以被称为给定类的实例。
>在Perl中,您可以通过软件包@ISA变量动态更改继承。
> Perl支持operator overloading。
>严格地说,Perl没有多行注释,但POD系统可以用于相同的效果。
>在Perl中,//是一个运算符。在PHP中,它是单行注释的开始。
>直到PHP 5.3,PHP对匿名函数(create_function函数)提供了可怕的支持,并且不支持闭包。
> PHP没有像Perl的软件包直到版本5.3,它引入了namespaces。
>可以说,Perl内置的对异常的支持几乎不像其他语言的异常,所以它们几乎看起来不像是异常。你评估一个块,并检查$ @(eval代替try,die
而不是throw)的值。 Error Try::Tiny模块支持异常,当您使用其他语言(以及Error’s See Also部分列出的其他一些模块)时。
PHP的灵感来自Perl,同样的方式Phantom的天堂的灵感来自歌剧的Phantom,或者Strange Brew是由哈姆雷特的灵感。在学习Perl时,最好将PHP的行为细节放在心里,否则你会跳起来。
我的大脑现在伤了,所以我要停下来。