我计划学习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)和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_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的行为细节放在心里,否则你会跳起来。

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

Perl和PHP之间的区别[closed]的更多相关文章

  1. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  2. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. ios – parse.com用于键,预期字符串的无效类型,但是得到了数组

    我尝试将我的数据保存到parse.com.我已经预先在parse.com上创建了一个名为’SomeClass’的类.它有一个名为’mySpecialColumn’的列,其数据类型为String.这是我尝试使用以下代码保存数据的代码:如果我运行这个我得到:错误:密钥mySpecialColumn的无效类型,预期字符串,但得到数组这就是我在parse.com上的核心外观:有谁知道我为什么会收到这个错误?

  5. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. ios – 上下文类型’NSFastEnumeration’不能与数组文字一起使用

    斯威夫特3,你会这样做吗?解决方法正如您所发现的,您不能使用as-casting将数组文字的类型指定为NSFastEnumeration.您需要找到一个符合NSFastEnumeration的正确类,在您的情况下它是NSArray.通常写这样的东西:

  7. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  8. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  9. ios – 以编程方式在Swift中添加联系人

    我想在Swift中以编程方式添加联系人.我发现了一些Objective-C示例,但我没有让它们工作,甚至在Objective-C中也没有.我不希望这涉及到AddressBookUI,因为我想从我自己的UI中获取值.解决方法这是在Swift中添加联系人的快速方法.我在我的iPhone5iOS7.1上验证了它,因为我发现模拟器并不总是与我的手机对AB的东西相同.您可以添加一个按钮并指向此方法:顺便说一下–它假设你已经分配了一个地址簿var,你可以通过覆盖viewDidAppear来打开视图.它也会执行安全提示

  10. ios – 为目标c中的方法传递未知类型的参数,可能吗?

    是否可以将未知类型的参数传递给objective-C方法?在C#中你可以写实现这一点,但我知道Objective-C没有泛型,所以有没有其他方法可以在Objective-C中实现这一点?我需要这个,因为我想创建一个方法来改变不同对象的文本颜色,如UITextField和UIButton的占位符文本.所以我的计划是创建一个名为textWhite的方法,然后在此方法中检查对象的类型,然后运行匹配的代码以使文本颜色变为白色.解决方法是的,可以传递未知类型的参数.见下面的例子.请参考使用id对象的链接作为参数Us

随机推荐

  1. 数组 – Perl中有什么神奇的数组?

    在Perldocumentationforreverse中,我发现:“请注意,将数组反转到自身(如@a=reverse@a)将尽可能保留不存在的元素;即对于非魔法数组或具有EXISTS和DELETE方法的绑定数组.什么属性区分神奇和非魔法阵列?解决方法一个神奇的阵列是一个执行它的操作不仅仅是改变内容.只有内置的魔术阵列是@ISA,而且这是非常不明显的.正如句子所暗示的,魔术阵列主要是一个绑定的阵列

  2. perl – 使用“isa”方法的最佳方式?

    什么是“最好的”使用方式“isa()”可靠?解决方法Scalar::Util实现明确更好.它避免了eval{}的开销,它总是导致设置一个附加变量.Scalar::Util实现更容易阅读.如果eval也失败了,我相信发生的是你在树之前向后走到eval之前的状态–这是如何实现复位状态.这带来了额外的故障开销.基准根本不是一个对象对象传递isa检查对象出现故障现象检查测试代码:我使用这是为i486-linux-gnu-thread-multi建立的perl,v5.10.1(*),以及Scalar::Util,1

  3. 在CORE :: GLOBAL中哪些Perl内置函数不能被覆盖?

    解决方法toke.c中任何值为负的值都可以被覆盖;所有其他人可能不会.你可以看源码here.例如,我们来看看第10,396行的waitpid:由于waitpid为负数,因此可能会被覆盖.grep怎么样?这是积极的,所以不能被覆盖.这意味着以下关键字不能被覆盖:chop,defined,delete,do,dump,each,else,elsif,eval,exists,for,foreach,format,glob,goto,grep,if,keys,last,local,m,map,my,next,no

  4. 如何在Perl中打印由换行符分隔的列表元素?

    什么是最简单的打印所有列表的元素以Perl中的换行符分隔的元素?解决方法在Perl5.10中:其他方式:或:或者怎么样?

  5. 使用Perl如何获取文件大小(以兆字节为单位)?

    我想以磁盘的形式获取磁盘上的文件大小.使用-s运算符给出了以字节为单位的大小,但是我将假设,然后将其除以魔术数字是一个坏主意:我应该使用只读变量来定义1024,还是有一种编程方式来获取一千字节的字节数?

  6. perl – 如何测试/分类CPAN模块的utf8正确性

    例如:File::Slurp,如果你将读取该文件您将根据命令行开关获得不同的结果,并且perl-CSDA将无法正常工作.伤心.(是的,我知道比Encode::decode(“utf8”,read_file($file,binmode=>’:raw’));将帮助,但是SAD.我的问题:>在这里任何首选方式,如何测试/分类什么CPAN模块是utf8安全/准备/正确?>这里是像Perl::Criticforutf8这样的东西–什么将检查模块源可能的utf8不正确?总结以上是DEVMAX为你收集整理的perl–如

  7. 如何删除Perl字符串中的空格?

    如果我声明一个值为’3’的变量$myString.是否有任何功能来删除返回值的空格.有点像SomeFun然后返回’3′.输出:你可以注意到’vid’=>‘0’,上面的代码从theanswer.我正在研究它.总结以上是DEVMAX为你收集整理的如何删除Perl字符串中的空格?如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  8. 如何在mod_perl2下运行Devel :: Cover?

    Unfortunately,Devel::Coverdoesnotyetworkwiththreads.它也不适用于prefork.在startup.pl中使用,Devel::Cover问题perl5.8.9,Apache2.2.13.我的操作系统是FreeBSD,如果重要.同样的问题是reportedforwin32.更新:PerlTrace全部输出解决方法邪恶之源似乎是Apache::DBI.

  9. 如何使用Perl中的C类?

    我有一套用C写的课.从Perl脚本中调用它们的最佳方法是什么?

  10. perl – 在Emacs中以双模式更好的缩进

    我正在使用Emacs来修改Perl和Verilog交织的代码.我正在使用two-mode-mode在两者之间切换,这样可以预期.问题是perl代码与//一行一行地表示;如下图所示:而双模式则认识到它是Perl,它是逐行的,所以缩进等在线上无意义.我想做的是使Perl代码像往常一样格式化,但忽略//;字符.有什么想法吗?我刚刚开始偷看模式文件,它们是可以理解的复杂的,所以任何提示都不会感激!

返回
顶部