2010-03-28 14 views
85

Planeo aprender Perl 5 y como solo he usado PHP hasta ahora, quería saber un poco acerca de cómo los idiomas se diferencian entre sí.Diferencias entre Perl y PHP

Como PHP comenzó como un conjunto de "piratas Perl" obviamente ha clonado algunas de las características de Perls.

  • ¿Cuáles son las principales diferencias en la sintaxis? ¿Es verdad que con Perl tienes más opciones y formas de expresar algo?

  • ¿Por qué Perl no se usa para sitios web dinámicos con mucha frecuencia? ¿Qué hizo que PHP ganara más popularidad?

+2

Siendo curioso, tengo que preguntar: si puede elegir libremente su segundo idioma después de PHP, ¿por qué Perl en lugar de Python o Ruby más modernos? – jholster

+33

¿Cuál es la base para que Python y Ruby sean más modernos? –

+2

No creo que la gente deba tratar de comparar idiomas. Solo conducirá a la confusión. –

Respuesta

7

Perl se utiliza un montón de sitios web, no menos que Python y Ruby, por ejemplo. Dicho esto, PHP se usa mucho más a menudo que cualquiera de esos. Creo que los factores más importantes en eso son la facilidad de implementación de PHP y la facilidad para comenzar.

Las diferencias en la sintaxis son demasiadas para resumir aquí, pero en general es cierto que tiene más formas de expresarse (esto se conoce como TIMTWOTDI, Hay más de una forma de hacerlo).

17

me he dado cuenta que la mayoría de PHP vs páginas Perl parece ser del PHP

es mejor que Perl porque < inserte razón cojo aquí >

calaña, y rara vez hacen comparaciones razonables.

En sintaxis, encontrará PHP es a menudo más fácil de entender que Perl, especialmente cuando tiene poca experiencia. Por ejemplo, el recorte de una cadena de espacio inicial y final en PHP es simplemente

$string = trim($string); 

En Perl es el algo más críptica

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

(creo que esto es ligeramente más eficiente que una sola captura de línea y reemplazar, y también un poco más comprensible.) Sin embargo, aunque PHP es a menudo más parecido al inglés, a veces todavía muestra sus raíces como un contenedor para bajo nivel C, por ejemplo, strpbrk y strspn son raramente usados, porque la mayoría Los dabblers de PHP escriben sus propias funciones equivalentes para cualquier cosa demasiado esotérica, más bien tha n pasar tiempo explorando el manual. También me pregunto acerca de los programadores para quienes el inglés es un segundo idioma, ya que todos están en igualdad de condiciones con cosas como Perl, teniendo que aprender de cero.

Ya he mencionado el manual. PHP tiene un buen manual en línea y, por desgracia, lo necesita. Todavía me refiero a él de vez en cuando para cosas que deberían ser simples, como el orden de los parámetros o la convención de nomenclatura de funciones. Con Perl, probablemente se dará cuenta de que se está refiriendo al manual a lote al comenzar y un día tendrá a-ha momento y nunca más lo necesitará. Bueno, al menos no hasta que estés más avanzado y te des cuenta de que no solo hay más de una forma, probablemente haya una manera mejor, alguien más probablemente ya lo haya hecho de esa manera, y tal vez deberías simplemente visitar CPAN.

Perl tiene muchas más opciones y formas de expresar las cosas. Esto no es necesariamente algo bueno, aunque permite que el código sea más legible si se usa con prudencia y al menos una de las formas en que es probable que esté familiarizado. Hay ciertos estilos y expresiones idiomáticas en las que se encontrará cayendo, y puedo recomendar encarecidamente leer Perl Best Practices (más temprano que tarde), junto con Perl Cookbook, Second Edition para ponerse al día con la resolución de problemas comunes.

Creo que la razón de Perl se utiliza con menos frecuencia en entornos de alojamiento compartido es que, históricamente, la lentitud percibida de CGI y anfitriones falta de voluntad para instalar mod_perl debido a cuestiones de seguridad y configuración de PHP ha hecho una opción más atractiva. Luego el ciclo continuó, más personas aprendieron a usar PHP porque más anfitriones lo ofrecieron, y más anfitriones lo ofrecieron porque eso es lo que la gente quería usar. Las diferencias de velocidad y los problemas de seguridad son irrelevantes por FastCGI en estos días, y en la mayoría de los casos PHP también se queda sin FastCGI, en lugar de dejarlo en el núcleo del servidor web.

Sea o no este es el caso o hay otras razones, PHP se hizo popular y se han escrito una gran cantidad de aplicaciones en él. Para la mayoría de las personas que solo desean un sitio web básico con un simple blog o galería de fotos, PHP es todo lo que necesitan, y eso es lo que promueven los anfitriones. No debe haber nada que le impida usar Perl (o cualquier otra cosa que elija) si lo desea.

a nivel empresarial, dudo que puedes encontrar demasiada PHP en la producción (y por favor, no hay un solo punto en Facebook como un contraejemplo, dije empresa nivel).

+0

¿Le importaría al votante de bajos ingresos explicar por qué? – Duncan

+2

Afortunadamente, cada vez es más fácil conseguir alojamiento con el alojamiento FastCGI, que ofrece un rendimiento decente sin las complicaciones de mod_perl. – Quentin

+0

@David Dorward: Bien. Estaba hablando en un sentido histórico, ya que FastCGI también ofrece un mejor rendimiento/seguridad que mod_php. Voy a editar eso para tratar de hacerlo un poco más claro. – Duncan

7

Lo que más me gusta de Perl es la forma en que maneja las matrices/listas. Aquí está un ejemplo de cómo podría hacer y usar una función de Perl (o "subprogramas"), que hace uso de esto para argumentos:

sub multiply 
{ 
    my ($arg1, $arg2) = @_; # @_ is the array of arguments 
    return $arg1 * $arg2; 
} 

En PHP que podría hacer una cosa similar con list(), pero no es bastante lo mismo; en las listas de Perl y las matrices se tratan de la misma manera (generalmente). También puede hacer cosas como:

$week_day_name = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")[$week_day_index]; 

Y otra diferencia que usted debe saber sobre, es decir, operadores de comparación numérica/cuerda. En Perl, si usa <, >, ==, !=, <=>, y así sucesivamente, Perl convierte ambos operandos en números. Si desea convertir como cadenas en su lugar, debe usar lt, gt, eq, ne, cmp (los equivalentes respectivos de los operadores enumerados anteriormente). Ejemplos en los que esto realmente conseguir que:

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

Las matrices y las listas * son * tratadas de la misma manera. –

+0

Sí, cierto. Creo que iba a decir eso, pero lo olvidé. Editado para reflejar eso. –

40

Cuando PHP llegaron a la escena, todos quedaron impresionados con principales diferencias con Perl:

  1. Las variables de entrada que ya están en el ámbito global, sin análisis aburrido.
  2. Incrustación de HTML. Solo <?php ... ?> en cualquier lugar. Sin plantillas aburridas
  3. Mensajes de error en la pantalla. No hay entradas de registro aburrido de errores.
  4. Fácil de aprender. No hay lectura aburrida de libros.

A medida que pasaba el tiempo, todo el mundo aprendieron que no eran un beneficio, jeje ...

252

Perl y PHP son más diferentes que por igual. Consideremos Perl 5, ya que Perl 6 aún está en desarrollo. Algunas diferencias, agrupadas aproximadamente por tema:

  • Perl tiene soporte nativo de expresiones regulares, incluyendo literales regexp. PHP usa las funciones regexp de Perl como una extensión.
  • Perl tiene bastantes más operators, incluyendo matching (=~, !~), quote-like (qw, qx & c.), exponentiation (**), string repetition (x) y range (.. y ...). PHP tiene algunos operadores que Perl no tiene, como error suppression operator (@), instanceof (aunque Perl tiene el método Universal ::isa) y clone.
  • En PHP, new es un operador. En Perl, es el nombre convencional de un object creation subroutine definido en paquetes, nada especial en lo que respecta al lenguaje.
  • Los operadores lógicos de Perl devuelven sus argumentos, mientras que return booleans en PHP. Pruebe:

    $foo = '' || 'bar'; 
    

    en cada idioma. En Perl, incluso puede hacer $foo ||= 'default' para establecer $ foo en un valor si aún no está configurado. El camino más corto de hacer esto en PHP es $foo = isset($foo) ? $foo : 'default'; (Update, en PHP 7.0 o superior que puede hacer $foo = $foo ?? 'default')

  • Perl variable names indican tipo incorporado, de los cuales Perl tiene tres, y el tipo especificador es parte del nombre (llamado "sigil"), por lo que $foo es una variable diferente de @foo o %foo.
  • (relacionado con el punto anterior) Perl tiene entradas symbol table separadas para escalares, matrices, hashes, código, identificadores de archivo/directorio y formatos. Cada uno tiene su propio espacio de nombres.
  • Perl da acceso al symbol table, aunque manipularlo no es para los débiles de corazón. En PHP, la manipulación de la tabla de símbolos está limitada a la creación de references y la función extract.
  • Tenga en cuenta que "referencias" tiene un significado diferente en PHP y Perl. En PHP, references son alias de tabla de símbolos. En Perl, references son punteros inteligentes.
  • Perl tiene diferentes tipos para colecciones indexadas enteras (matrices) y colecciones indexadas de cadenas (hashes). En PHP, son del mismo tipo: un associative array/ordered map.
  • Los arrays de Perl no son escasos: la configuración de un elemento con un índice mayor que el tamaño actual de la matriz establecerá todos los elementos intermedios en undefined (consulte perldata). Las matrices PHP son dispersas; establecer un elemento no establecerá elementos intermedios.
  • Perl admite hash y matriz slices de forma nativa, y las divisiones son asignables, que tiene todo tipo de uses. En PHP, usa array_slice para extraer un segmento y array_splice para asignarlo a un sector.
  • Puede omitir el argument to the subscript operator en PHP por un poco de magia. En Perl, no puedes dejar de lado el subíndice.
  • Los hashes de Perl son unordered.
  • Perl tiene un gran número de predefined and magic variables. El predefined variables de PHP tiene un propósito bastante diferente.
  • Perl tiene statement modifiers: algunas declaraciones de control se pueden colocar al final de una declaración.
  • Perl admite dynamic scoping mediante la palabra clave local.
  • Además, Perl tiene global, léxico (bloque) y el paquete scope. PHP tiene global, función, objeto, clase y espacio de nombres scope.
  • En Perl, las variables son globales por defecto. En PHP, las variables en las funciones son locales por defecto.
  • Perl admite explícitamente tail calls a través de la función goto.
  • prototypes de Perl proporcionan comprobación de tipos más limitada para argumentos de funciones que PHP type hinting. Como resultado, los prototipos tienen una utilidad más limitada que la tipificación de tipo.
  • En Perl, la última declaración evaluada se devuelve como el valor de una subrutina si la declaración es una expresión (es decir, tiene un valor), incluso si no se utiliza una declaración de devolución. Si la última instrucción no es una expresión (es decir, no tiene un valor), como un bucle, el valor de retorno no está especificado (consulte perlsub). En PHP, si no hay retorno explícito, el return value is NULL.
  • Perl aplana las listas (ver perlsub); para estructuras de datos no aplanadas, use referencias.

    @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 no aplana las matrices.

  • Perl tiene special code blocks (BEGIN, UNITCHECK, CHECK, INIT y END) que se ejecutan. A diferencia de PHP auto_prepend_file y auto_append_file, no hay límite para el número de cada tipo de bloque de código. Además, los bloques de código se definen dentro de los scripts, mientras que las opciones de PHP se establecen en el servidor y en los archivos de configuración por directorio.
  • En Perl, el punto y coma separates statements. En PHP, es terminates, excepto que una etiqueta de cierre de PHP ("?>") También puede terminar una declaración.
  • El valor de las expresiones en Perl es context sensitive.
  • Los subíndices negativos en Perl son relativos al final de la matriz. $bam[-1] es el elemento final de la matriz. Los subíndices negativos en PHP son subíndices como cualquier otro.
  • En Perl 5, las clases se basan en paquetes y no se parecen en nada a las clases de PHP (ni a la mayoría de los demás idiomas). Las clases de Perl 6 están más cerca de las clases de PHP, pero aún son bastante diferentes. (Perl 6 es different de Perl 5 de muchas otras maneras, pero eso está fuera de tema). Muchas de las diferencias entre Perl 5 y PHP surgen del hecho de que la mayoría de las características de OO no están incorporadas a Perl, sino que se basan en hacks. Por ejemplo, $obj->method(@args) se traduce a algo así como (ref $obj)::method($obj, @args). Lista no exhaustiva:
    • PHP proporciona automáticamente la variable especial $this en los métodos. Perl pasa una referencia al objeto como primer argumento para los métodos.
    • Perl requiere referencias para ser blessed para crear un objeto. Cualquier referencia puede ser bendecida como una instancia de una clase dada.
    • En Perl, puede cambiar dinámicamente la herencia a través de la variable de paquetes @ISA.
  • Perl admite operator overloading.
  • Estrictamente hablando, Perl no tiene comentarios de líneas múltiples, pero el sistema POD se puede usar para el mismo efecto.
  • En Perl, // es un operador. En PHP, es el comienzo de un comentario de una línea.
  • Hasta PHP 5.3, PHP tenía un soporte terrible para funciones anónimas (la función create_function) y no admite cierres.
  • PHP no tenía nada como los paquetes de Perl hasta la versión 5.3, que introdujo namespaces.
  • Podría decirse que el soporte integrado de Perl para las excepciones no se parece en nada a las excepciones en otros idiomas, tanto que apenas parecen excepciones. Evalúa un bloque y comprueba el valor de [email protected] (eval en lugar de try, die en lugar de throw). El módulo ErrorTry::Tiny admite excepciones ya que las encuentra en otros idiomas (así como en algunos otros módulos enumerados en la sección Error's See Also).

PHP se inspiró en Perl de la misma manera El fantasma del paraíso se inspiró en fantasma de la ópera, o Strange Brew se inspiró en Hamlet. Lo mejor es olvidarte de los detalles de comportamiento de PHP cuando aprendas Perl, de lo contrario te tropezarás.

Me duele el cerebro ahora, así que voy a detenerme.

+18

Esta es una respuesta fantástica, y me siento mal haciéndolo tan quisquilloso, pero solo eres * la mayoría * correcto acerca de las matrices Perl. Cuando tienes '@array = qw (abc)' y haces '$ array [4] = 'e'', el contenido de la matriz no es exactamente' (' a ',' b ',' c ', undef, 'e') '; son '('a', 'b', 'c',' * nonexistent *, ''e')'. Es decir, la ranura '[3]' no contiene un puntero a un escalar que es undef; no contiene nada en absoluto (y el operador 'existe' prueba esto). Una pequeña diferencia, pero una diferencia. :) – hobbs

+6

HOMBRE, esta es una de las MEJORES respuestas que he visto. Especialmente la parte sobre la inspiración. Simplemente: genial y VERDADERO. ;) – jm666

+2

La manera más corta de configurar un valor a '$ foo' si no está ya configurado puede ser' isset ($ foo) || $ foo = 'default'; ' – alexbusu

4

No necesito añadir nada a la fantástica respuesta de Outis, sólo quiero mostrarles la respuesta para usted pregunta:

¿Por qué no Perl utilizado para sitios web dinámicos con mucha frecuencia? ¿Qué hizo que PHP ganara más popularidad que él?

Primero verifique algunos sitios de "Tendencias del trabajo", y usted puede juzgar solo.

como se puede ver, Perl es todavía un líder - pero preferible para aplicaciones reales no para los juguetes. :)

+1

Creo que esta comparación también es interesante: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C –

+1

Se ha corregido el enlace roto, POR FAVOR USE: http://www.simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby%2C%2BJava%2C%2BC%2523%2C%2BC –

+0

SH.com/a/jobtrends parece no existir. POR FAVOR USE: http://www.simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby –

Cuestiones relacionadas