gpt4 book ai didi

php - Perl 和 PHP 的区别

转载 作者:行者123 更新时间:2023-12-01 17:22:55 24 4
gpt4 key购买 nike

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




8年前关闭。




我打算学习 Perl 5,因为到目前为止我只使用过 PHP,所以我想了解一下这些语言之间的区别。

当 PHP 开始时是一组“Perl hacks”,它显然已经克隆了一些 Perls 特性。

  • 语法的主要区别是什么?使用 Perl,您真的有更多的选择和表达方式吗?
  • 为什么 Perl 不再经常用于动态网站?是什么让 PHP 越来越受欢迎?
  • 最佳答案

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

  • Perl 具有 native 正则表达式支持,包括正则表达式文字。 PHP 使用 Perl 的 regexp 函数作为扩展。
  • Perl 还有不少 operators ,包括 matching ( =~ , !~ ), quote-like ( qw , qx 等), exponentiation ( ** ), string repetition ( x ) 和 range ( ..... )。 PHP 有一些 Perl 没有的操作符,例如 error suppression operator ( @ ), instanceof (虽然 Perl 确实有 Universal::isa 方法)和 clone .
  • 在 PHP 中, new 是一个运算符。在 Perl 中,它是 object creation subroutine 的常规名称在包中定义,就语言而言没有什么特别的。
  • Perl 逻辑运算符返回它们的参数,而它们 return booleans在 PHP 中。尝试:
    $foo = '' || 'bar';

    在每种语言中。在 Perl 中,你甚至可以做 $foo ||= 'default'如果 $foo 尚未设置,则将其设置为一个值。在 PHP 中执行此操作的最短方法是 $foo = isset($foo) ? $foo : 'default'; (更新,在 PHP 7.0+ 中你可以做 $foo = $foo ?? 'default')
  • Perl variable names表示内置类型,其中Perl 有3 个,类型说明符是名称的一部分(称为“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 native ,切片是可分配的,其中有各种 uses .在 PHP 中,您使用 array_slice 提取切片和 array_splice 分配给一个切片。
  • 您可以省略 argument to the subscript operator在 PHP 中有点魔法。在 Perl 中,您不能省略下标。
  • Perl 哈希是 unordered .
  • Perl 有大量 predefined and magic variables . PHP的predefined variables有完全不同的目的。
  • Perl 有 statement modifiers : 一些控制语句可以放在语句的末尾。
  • Perl 支持 dynamic scoping通过 local关键字。
  • 此外,Perl 还有全局、词法(块)和包 scope . PHP 具有全局、函数、对象、类和命名空间 scope .
  • 在 Perl 中,变量默认是全局的。在 PHP 中,函数中的变量默认是局部的。
  • Perl 支持显式 tail calls通过 goto 功能。
  • Perl 的 prototypes为函数参数提供比 PHP 更有限的类型检查 type hinting .因此,原型(prototype)比类型提示的效用更有限。
  • 在 Perl 中,如果语句是一个表达式(即它有一个值),即使没有使用 return 语句,最后评估的语句也会作为子例程的值返回。如果最后一条语句不是表达式(即没有值),例如循环,则返回值未指定(请参阅 perlsub )。在 PHP 中,如果没有显式返回,return value is 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 有 special code blocks ( BEGINUNITCHECKCHECKINITEND )被执行。不像 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->method(@args)被翻译成类似 (ref $obj)::method($obj, @args) 的东西.非详尽 list :
  • PHP 自动提供特殊变量 $this在方法中。 Perl 将对象的引用作为方法的第一个参数传递。
  • Perl 要求引用为 blessed创建一个对象。任何引用都可以被祝福为给定类的实例。
  • 在 Perl 中,您可以通过包 @ISA 动态更改继承。变量。
  • Perl 支持 operator overloading .
  • 严格来说,Perl 没有多行注释,但 POD系统可用于相同的效果。
  • 在 Perl 中,//是一个运算符。在 PHP 中,它是单行注释的开始。
  • 在 PHP 5.3 之前,PHP 对匿名函数(create_function 函数)的支持非常糟糕,并且不支持闭包。
  • PHP 在 5.3 版本之前没有任何类似于 Perl 的包,该版本引入了 namespaces .
  • 可以说,Perl 对异常的内置支持与其他语言中的异常几乎完全不同,以至于它们几乎不像异常。您评估一个块并检查 $@ 的值( eval 而不是 try die 而不是 throw )。 Error Try::Tiny模块支持您在其他语言中发现的异常(以及 Error's See Also 部分中列出的其他一些模块)。

  • PHP 受到 Perl 的启发,就像天堂幻影受到歌剧魅影的启发,或者 Strange Brew 受到哈姆雷特的启发一样。最好在学习 Perl 时把 PHP 的行为细节放在脑子之外,否则你会被绊倒。

    我的脑子现在很痛,所以我要停下来。

    关于php - Perl 和 PHP 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2534756/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com