微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Perl和PHP之间的区别[closed]

我计划学习Perl 5,因为我只使用PHP直到现在,我想知道一些语言如何彼此不同。

由于PHP开始是一组“Perl hacks”,它显然克隆了一些Perls功能

>语法的主要区别是什么?是真的,与Perl你有更多的选择和方式来表达什么?
>为什么Perl不再经常用于动态网站?什么使PHP得到更多的人气?

解决方法

Perl和PHP比同类更不同。让我们考虑Perl 5,因为Perl 6仍在开发中。一些差异,主题大致分组:

> Perl具有原生的正则表达式支持包括regexp文字PHP使用Perl的regexp函数作为扩展。
> Perl有更多的operators包括matching(=〜,!〜),quote-like(qw,qx& c。),exponentiation(**),string repetition(x)和rangePHP有几个操作符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中,符号表操作仅限于创建referencesextract函数
>请注意,“引用”在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 operatorPHP中的一点魔法。在Perl中,你不能省略下标。
> Perl hashes是unordered
> Perl有大量的predefined and magic variables.PHPpredefined variables有不同的目的。
> Perl has statement modifiers:一些控制语句可以放在语句的结尾。
> Perl通过本地关键字支持dynamic scoping
>此外,Perl具有全局,词法(块)和包scope. PHP具有全局,函数,对象,类和命名空间scope
>在Perl中,认情况下变量是全局变量。在PHP中,函数中的变量认是本地的。
> Perl通过goto函数支持显式tail calls
> Perl的prototypesPHPtype 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)被执行。与PHPauto_prepend_fileauto_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的行为细节放在心里,否则你会跳起来。

我的大脑现在伤了,所以我要停下来。

原文地址:https://www.jb51.cc/Perl/173548.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐