Diferencias entre Perl y PHP [cerrado]

101

Estoy planeando aprender Perl 5 y como solo he usado PHP hasta ahora, quería saber un poco sobre cómo los lenguajes se diferencian entre sí.

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

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

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

mira
fuente
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
37
¿Cuál es la base para que Python y Ruby sean más modernos?
Joshua Partogi
2
No creo que la gente deba intentar comparar idiomas. Solo conducirá a la confusión.
Ben Shelock
11
@Ben: comparar la sintaxis tiene una utilidad limitada. La comparación de funciones puede ayudar a aprender nuevos idiomas.
Salida
1
Creo que cada lenguaje tiene su fuerza basada en lo que los diseñadores imaginaron para él; particularmente basado en un conjunto de casos de uso. Por lo tanto, comparar idiomas es a menudo
parcial

Respuestas:

284

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

  • Perl tiene soporte nativo para expresiones regulares, incluidos los literales regexp. PHP usa las funciones de expresión regular de Perl como una extensión.
  • Perl tiene bastantes operadores más , que incluyen coincidencias ( =~, !~), comillas ( qw, qx& c.), Exponenciación ( **), repetición de cadenas ( x) y rango ( ..y ...). PHP tiene algunos operadores que Perl no tiene, como el operador de supresión de errores ( @), instanceof(aunque Perl tiene el Universal::isamétodo) y clone.
  • En PHP, newes un operador. En Perl, es el nombre convencional de una subrutina de creación de objetos definida en paquetes, nada especial en lo que respecta al lenguaje.
  • Los operadores lógicos de Perl devuelven sus argumentos, mientras que devuelven booleanos en PHP. Tratar:

    $foo = '' || 'bar';

    en cada idioma. En Perl, incluso puede hacer $foo ||= 'default'para establecer $ foo en un valor si aún no lo está. La forma más corta de hacer esto en PHP es $foo = isset($foo) ? $foo : 'default';(Actualización, en PHP 7.0+ puede hacerlo $foo = $foo ?? 'default')

  • Los nombres de las variables de Perl indican el tipo incorporado, de los cuales Perl tiene tres, y el especificador de tipo es parte del nombre (llamado " sigilo "), por lo que $fooes una variable diferente de @fooo %foo.
  • (relacionado con el punto anterior) Perl tiene entradas de tabla de símbolos separadas para escalares, matrices, hashes, código, identificadores de archivos / directorios y formatos. Cada uno tiene su propio espacio de nombres.
  • Perl da acceso a la tabla de símbolos , aunque manipularla no es para los débiles de corazón. En PHP, la manipulación de la tabla de símbolos se limita a crear referencias y la extractfunción.
  • Tenga en cuenta que "referencias" tiene un significado diferente en PHP y Perl. En PHP, las referencias son alias de tablas de símbolos. En Perl, las referencias son punteros inteligentes.
  • Perl tiene diferentes tipos de colecciones indexadas con números enteros (matrices) y colecciones indexadas con cadenas (hashes). En PHP, son del mismo tipo: una matriz asociativa / mapa ordenado .
  • Las matrices de Perl no son escasas: configurar un elemento con un índice mayor que el tamaño actual de la matriz establecerá todos los elementos intermedios en undefined(ver perldata ). Las matrices PHP son escasas; establecer un elemento no establecerá elementos intermedios.
  • Perl admite trozos de matriz y hash de forma nativa, y los segmentos son asignables, lo que tiene todo tipo de usos . En PHP, se usa array_slicepara extraer un segmento y array_spliceasignarlo a un segmento.
  • Puede omitir el argumento del operador de subíndice en PHP por un poco de magia. En Perl, no puede omitir el subíndice.
  • Los hash de Perl no están ordenados .
  • Perl tiene una gran cantidad de variables mágicas y predefinidas . Las variables predefinidas de PHP tienen un propósito bastante diferente.
  • Perl tiene modificadores de declaraciones : algunas declaraciones de control se pueden colocar al final de una declaración.
  • Perl admite el alcance dinámico mediante la localpalabra clave.
  • Además, Perl tiene alcance global, léxico (bloque) y paquete . PHP tiene alcance global, función, objeto, clase y espacio de nombres .
  • En Perl, las variables son globales por defecto. En PHP, las variables de las funciones son locales por defecto.
  • Perl admite llamadas de cola explícitas a través de la gotofunción.
  • Los prototipos de Perl proporcionan una verificación de tipo más limitada para los argumentos de función que la sugerencia de tipo de PHP . Como resultado, los prototipos tienen una utilidad más limitada que las sugerencias 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 usa una declaración de retorno. Si la última declaración no es una expresión (es decir, no tiene un valor), como un bucle, el valor de retorno no está especificado (ver perlsub ). En PHP, si no hay un retorno explícito, el valor de retorno es NULL .
  • Perl aplana las listas (ver perlsub ); para estructuras de datos no aplanadas, utilice 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 bloques de código especiales ( BEGIN, UNITCHECK, CHECK, INITy END) que son ejecutados. A diferencia de PHP auto_prepend_filey 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 los archivos de configuración del servidor y por directorio.
  • En Perl, el punto y coma separa las declaraciones . En PHP, los termina , excepto que una etiqueta de cierre de PHP ("?>") También puede terminar una declaración.
  • El valor de las expresiones en Perl es sensible al contexto .
  • 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 (o la mayoría de los otros lenguajes). Las clases de Perl 6 están más cerca de las clases de PHP, pero siguen siendo bastante diferentes. (Perl 6 es diferente de Perl 5 en muchos otros aspectos, 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 funciones de OO no están integradas en Perl sino que se basan en hacks. Por ejemplo, $obj->method(@args)se traduce a algo como (ref $obj)::method($obj, @args). Lista no exhaustiva:
    • PHP proporciona automáticamente la variable especial $thisen métodos. Perl pasa una referencia al objeto como primer argumento de los métodos.
    • Perl requiere que las referencias sean bendecidas para crear un objeto. Cualquier referencia puede ser bendecida como un ejemplo de una clase determinada.
    • En Perl, puede cambiar dinámicamente la herencia a través de la @ISAvariable de paquetes .
  • Perl admite la sobrecarga del operador .
  • Estrictamente hablando, Perl no tiene comentarios de varias líneas, pero el sistema POD puede usarse 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 create_functionfunción) y no tenía soporte para cierres.
  • PHP no tenía nada como los paquetes de Perl hasta la versión 5.3, que introdujo espacios de nombres .
  • Podría decirse que el soporte integrado de Perl para las excepciones no se parece en nada a las excepciones en otros lenguajes, tanto que apenas parecen excepciones. Evalúa un bloque y verifica el valor de $@(en evallugar de try, en dielugar de throw). El módulo Error Try :: Tiny admite excepciones a medida que las encuentre en otros idiomas (así como algunos otros módulos enumerados en la sección Ver también de Error ).

PHP se inspiró en Perl de la misma manera que Phantom of the Paradise se inspiró en Phantom of the Opera , o Strange Brew se inspiró en Hamlet . Es mejor olvidarse de los aspectos específicos del comportamiento de PHP cuando aprende Perl, de lo contrario, se tropezará.

Ahora me duele el cerebro, así que voy a parar.

outis
fuente
21
Esta es una respuesta fantástica, y me siento mal haciendo una pequeña nitpick tales en él, pero usted es única en su mayoría a la derecha acerca de las matrices de Perl. Cuando lo tiene @array = qw(a b c)y lo hace $array[4] = 'e', el contenido de la matriz no es exactamente ('a', 'b', 'c', undef, 'e'); son ('a', 'b', 'c', inexistentes , 'e'). Es decir, la [3]ranura no tiene un puntero a un escalar que no sea definido; no contiene nada en absoluto (y el existsoperador lo prueba). Una pequeña diferencia, pero una diferencia. :)
hobbs
9
HOMBRE, esta es una de las MEJORES respuestas que he visto. Especialmente la parte de la inspiración. Simplemente: genial y VERDADERO. ;)
jm666
2
La forma más corta de configurar un valor $foosi aún no está configurado puede serisset($foo) || $foo='default';
alexbusu
45

Cuando PHP apareció en escena, todos quedaron impresionados con las principales diferencias con Perl:

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

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

Tu sentido común
fuente
21

Me he dado cuenta de que la mayoría de las páginas PHP frente a Perl parecen ser del tipo

PHP es mejor que Perl porque <inserte un motivo lamentable aquí>

calaña, y rara vez hacen comparaciones razonables.

En cuanto a la sintaxis, encontrará que PHP es a menudo más fácil de entender que Perl, especialmente cuando tiene poca experiencia. Por ejemplo, recortar una cadena de espacios en blanco iniciales y finales en PHP es simplemente

$string = trim($string);

En Perl es algo más críptico

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

(Creo que esto es un poco más eficiente que capturar y reemplazar una sola línea, 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 envoltorio para el nivel C bajo, por ejemplo, strpbrky strspnprobablemente se usen con poca frecuencia, porque la mayoría de los aficionados a PHP escriben sus propias funciones equivalentes para algo demasiado esotérico, en lugar de perder tiempo explorando el manual. También me pregunto acerca de los programadores para quienes el inglés es un segundo idioma, ya que todo el mundo está en pie de igualdad con cosas como Perl, teniendo que aprenderlo desde cero.

Ya he mencionado el manual. PHP tiene un excelente manual en línea, y desafortunadamente 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, es probable que encuentre que usted se refiere a un manual del montón como a empezar y entonces un día usted tendrá una a-ha momento y nunca se necesite de nuevo. Bueno, al menos no hasta que esté más avanzado y se dé cuenta de que no solo hay más de una forma, sino que probablemente haya una forma mejor, es probable que alguien más ya lo haya hecho de esa forma mejor, y tal vez debería 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 con las que probablemente esté familiarizado. Hay ciertos estilos y modismos en los que se encontrará cayendo, y le recomiendo encarecidamente leer las Mejores prácticas de Perl (más temprano que tarde), junto con Perl Cookbook, Segunda edición para ponerse al día en la resolución de problemas comunes.

Creo que la razón por la que Perl se usa con menos frecuencia en entornos de alojamiento compartido es que históricamente la lentitud percibida de CGI y la falta de voluntad de los hosts para instalar mod_perl debido a problemas de seguridad y configuración ha hecho de PHP una opción más atractiva. Luego, el ciclo continuó, más personas aprendieron a usar PHP porque más hosts lo ofrecían y más hosts lo ofrecían porque eso era lo que la gente quería usar. Las diferencias de velocidad y los problemas de seguridad son discutidos 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 el caso o existen 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 quieren un sitio web de nivel de entrada con un blog simple o una galería de fotos, PHP es todo lo que necesitan, así que eso es lo que promueven los anfitriones. No debería haber nada que le impida usar Perl (o cualquier otra cosa que elija) si lo desea.

A nivel empresarial, dudo que encuentre demasiado PHP en producción (y por favor, nadie apunta a Facebook como contraejemplo, dije nivel empresarial ).

Duncan
fuente
2
Afortunadamente, cada vez es más fácil conseguir hosting con FastCGI hosting que ofrece un rendimiento decente sin las complicaciones de mod_perl.
Quentin
@David Dorward: Está bien. Estaba hablando en un sentido histórico, ya que FastCGI también ofrece un mejor rendimiento / seguridad que mod_php. Lo editaré para intentar que quede un poco más claro.
Duncan
3
Tu ejemplo de corte no tiene sentido. ¿Cuál es mejor o 4 operadores para recordar todos los parámetros inconsistentes y valores de retorno de todas las funciones de PHP como Ereg ereg_replace eregi eregi_replace mb_ereg mb_ereg_replace mb_eregi mb_eregi_replace preg_match preg_match_all preg_replace str_replace str_ireplace strstr stristr strrchr strpos stripos strrpos strripos mb_strrpos mb_strpos
Myforwik
3
Su ejemplo de recorte de Perl podría ser mucho más simple:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo
1
@Myforwik, mi ejemplo de recorte estaba destinado a demostrar que Perl carece de funciones obvias, lo que puede resultar confuso para un principiante. Una vez que aprenda la sintaxis, sí, es mucho más fácil que lidiar con todas las inconsistencias; también mencioné ese punto sobre la necesidad del manual constantemente.
Duncan
9

Perl se usa mucho para sitios web, no menos que Python y Ruby, por ejemplo. Dicho esto, PHP se usa con mucha más frecuencia que cualquiera de esos. Creo que los factores más importantes son la facilidad de implementación de PHP y la facilidad para comenzar con él.

Las diferencias de sintaxis son demasiadas para resumirlas 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).

Leon Timmermans
fuente
9

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

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

En PHP se puede hacer algo similar list(), pero no es exactamente lo mismo; en Perl, las listas y las matrices se tratan de la misma forma (normalmente). También puedes hacer cosas como:

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

Y otra diferencia que DEBE conocer son los operadores de comparación numéricos / de cadena. En Perl, si se utiliza <, >, ==, !=, <=>, y así sucesivamente, Perl convierte los dos operandos a números. Si desea convertir como cadenas en su lugar, usted tiene que utilizar lt, gt, eq, ne, cmp(los equivalentes respectivos de los operadores enumerados anteriormente). Ejemplos donde esto realmente te llevará:

if ("a" == "b") { ... } # This is true.
if ("a" == 0) { ... } # This is also true, for the same reason.
crimson_penguin
fuente
Las matrices y las listas generalmente se tratan de la misma manera.
Brad Gilbert
Si verdad. Creo que iba a decir eso, pero lo olvidé. Editado para reflejar eso.
crimson_penguin
4

No necesito agregar nada a la fantástica respuesta de outis, solo quiero mostrar la respuesta para su pregunta:

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

Primero, consulte algunos sitios de "Tendencias laborales", y podrá emitir un juicio solo.

como puede ver, perl sigue siendo líder, pero es preferible para aplicaciones reales, no para juguetes. :)

jm666
fuente
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
Sorin Postelnicu
1
Enlace roto fijo, POR FAVOR UTILICE: Simplyhired.com/…
r4.
SH.com/a/jobtrends parece no existir. POR FAVOR UTILICE: Simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.
@ r4.sus enlaces no son los mismos que el enlace original (ahora roto). El original muestra un gráfico (como el anterior), no algunas listas de trabajos. Los enlaces a la lista de trabajos están fuera del alcance.
jm666