web-dev-qa-db-fra.com

Différences entre Perl et PHP

Je prévois d'apprendre Perl 5 et comme je n'ai utilisé que PHP jusqu'à présent, je voulais en savoir un peu plus sur la façon dont les langues diffèrent les unes des autres.

Comme PHP a commencé comme un ensemble de "hacks Perl", il a visiblement cloné certaines des fonctionnalités de Perls.

  • Quelles sont les principales différences dans la syntaxe? Est-il vrai qu'avec Perl, vous avez plus d'options et de moyens d'exprimer quelque chose?

  • Pourquoi Perl n'est-il plus très souvent utilisé pour les sites Web dynamiques? Qu'est-ce qui a rendu PHP plus populaire?

100
lok

Perl et PHP sont plus différents les uns des autres. Considérons Perl 5, étant donné que Perl 6 est en cours de développement. Quelques différences, regroupées plus ou moins par sujet:

  • Perl prend en charge les expressions régulières natives, y compris les littéraux d'expression rationnelle. PHP utilise les fonctions d'expression rationnelle de Perl comme extension.
  • Perl en a encore un peu opérateurs , y compris correspondance (=~, !~), comme des guillemets (qw, qx & c.), exponentiation (**), répétition de chaîne (x) et plage (.. et ...). PHP a quelques opérateurs que Perl n'a pas, tels que opérateur de suppression d'erreur (@), instanceof (bien que Perl utilise la méthode Universal::isa) et clone .
  • En PHP, new est un opérateur. En Perl, c'est le nom classique d'un sous-programme de création d'objet défini dans les packages, rien de spécial en ce qui concerne le langage.
  • Les opérateurs logiques Perl retournent leurs arguments, alors qu'ils retournent des booléens en PHP. Essayer:

    $foo = '' || 'bar';
    

    dans chaque langue. En Perl, vous pouvez même faire $foo ||= 'default' Pour définir $ foo sur une valeur si elle n'est pas déjà définie. Le moyen le plus rapide de faire ceci dans PHP est $foo = isset($foo) ? $foo : 'default'; _ (Mise à jour, dans PHP 7.0+) vous pouvez faire $foo = $foo ?? 'default' )

  • Perl noms de variables indique le type intégré, dont Perl en a trois, et le spécificateur de type fait partie du nom (appelé " sigil "), donc $foo Est une variable différente de @foo Ou %foo.
  • (lié au point précédent) Perl a des entrées table de symboles distinctes pour les scalaires, les tableaux, les hachages, le code, les descripteurs de fichier/répertoire et les formats. Chacun a son propre espace de noms.
  • Perl donne accès à table des symboles , bien que le manipuler ne soit pas pour les âmes sensibles. En PHP, la manipulation de la table des symboles est limitée à la création de références et de la fonction extract .
  • Notez que "références" a une signification différente dans PHP et Perl. En PHP, références sont des alias de table des symboles. En Perl, références sont des pointeurs intelligents.
  • Perl a différents types pour les collections indexées par des nombres entiers (tableaux) et les collections indexées par chaînes (hachages). En PHP, ils sont du même type: un tableau associatif/ordonné .
  • Les tableaux Perl ne sont pas rares: définir un élément avec un index supérieur à la taille actuelle du tableau définira tous les éléments intermédiaires sur undefined (voir perldata ). PHP Les tableaux sont clairsemés; définir un élément ne définira pas les éléments intermédiaires.
  • Perl prend en charge le hachage et le tableau tranches de manière native, et les tranches sont assignables, ce qui présente toutes sortes de tilisations . En PHP, vous utilisez array_slice pour extraire une tranche et array_splice pour l'attribuer à une tranche.
  • Vous pouvez omettre le argument de l'opérateur d'indice dans PHP pour un peu de magie. En Perl, vous ne pouvez pas omettre l'indice.
  • Les hachages Perl sont non ordonnés .
  • Perl a un grand nombre de variables prédéfinies et magiques . Les variables prédéfinies de PHP ont un but différent.
  • Perl a modificateurs d'instruction : certaines instructions de contrôle peuvent être placées à la fin d'une instruction.
  • Perl prend en charge portée dynamique via le mot clé local.
  • De plus, Perl a global, lexical (block) et package scope . PHP a une fonction globale, une fonction, un objet, une classe et un espace de noms scope .
  • En Perl, les variables sont globales par défaut. En PHP, les variables dans les fonctions sont locales par défaut.
  • Perl supporte explicitement les appels finaux via la fonction goto .
  • Les Perl prototypes fournissent une vérification de type plus limitée pour les arguments de la fonction que celle de PHP indication de type . En conséquence, les prototypes ont une utilité plus limitée que les indications de type.
  • En Perl, la dernière instruction évaluée est renvoyée en tant que valeur d'un sous-programme si l'instruction est une expression (c'est-à-dire qu'elle a une valeur), même si une instruction return n'est pas utilisée. Si la dernière instruction n'est pas une expression (c'est-à-dire qu'elle n'a pas de valeur), telle qu'une boucle, la valeur de retour n'est pas spécifiée (voir perlsub ). En PHP, s'il n'y a pas de retour explicite, le la valeur de retour est NULL .
  • Perl aplatit les listes (voir perlsub ); Pour les structures de données non aplaties, utilisez des références.

    @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 n'aplatit pas les tableaux.

  • Perl a blocs de code spéciaux (BEGIN, UNITCHECK, CHECK, INIT et END) réalisé. À la différence des auto_prepend_file et des auto_append_file de PHP, il n'y a pas de limite au nombre de chaque type de bloc de code. En outre, les blocs de code sont définis dans les scripts, alors que les options PHP sont définies dans les fichiers de configuration du serveur et par répertoire).
  • En Perl, le point-virgule instructions distinctes . En PHP, il se termine eux, sauf que la balise PHP) ("?>") Peut également terminer une instruction.
  • La valeur des expressions en Perl est sensible au contexte .
  • Les indices négatifs en Perl sont relatifs à la fin du tableau. $bam[-1] Est le dernier élément du tableau. Les indices négatifs dans PHP sont des indices comme les autres.
  • En Perl 5, les classes sont basées sur des paquets et ne ressemblent en rien aux classes de PHP (ou de la plupart des autres langues). Les classes Perl 6 sont plus proches de PHP classes, mais il reste tout à fait différent. (Perl 6 est différent de Perl 5 à bien d'autres égards, mais c'est hors sujet.) Beaucoup de différences entre Perl 5 et PHP se présentent du fait que la plupart des fonctionnalités OO ne sont pas intégrées à Perl, mais basées sur des hacks. Par exemple, $obj->method(@args) est traduit en quelque chose comme (ref $obj)::method($obj, @args). Liste non exhaustive:
    • PHP fournit automatiquement la variable spéciale $this Dans les méthodes. Perl transmet une référence à l'objet en tant que premier argument des méthodes.
    • Perl exige que les références soient bénies pour créer un objet. Toute référence peut être une bénédiction en tant qu'instance d'une classe donnée.
    • En Perl, vous pouvez modifier dynamiquement l'héritage via la variable packages @ISA.
  • Perl supporte surcharge de l'opérateur .
  • Strictement parlant, Perl n'a pas de commentaires multilignes, mais le système POD peut être utilisé pour le même effet.
  • En Perl, // Est un opérateur. En PHP, c'est le début d'un commentaire d'une ligne.
  • Jusqu'au PHP 5.3, PHP avait un support terrible pour les fonctions anonymes (la fonction create_function)) Et aucun support pour les fermetures.
  • Jusqu'à la version 5.3, PHP n'avait rien à voir avec les paquets de Perl, qui introduisaient namespaces .
  • On peut soutenir que la prise en charge intégrée des exceptions par Perl ne ressemble presque pas à des exceptions dans d'autres langues, à tel point qu'elles ne ressemblent guère à des exceptions. Vous évaluez un bloc et vérifiez la valeur de $@ (eval au lieu de try, die au lieu de throw). Le ErreurTry :: Tiny module prend en charge les exceptions lorsque vous les trouvez dans d'autres langues (ainsi que certains autres modules énumérés dans la section Voir aussi la section sur l'erreur ).

PHP a été inspiré par Perl de la même manière Le fantôme du paradis a été inspiré de Le fantôme de l'opéra , ou Strange Brew a été inspiré par Hamlet . Il est préférable de ne pas penser aux comportements spécifiques de PHP lors de l’apprentissage de Perl, sinon vous vous ferez ébranler.

Mon cerveau me fait mal maintenant, alors je vais m'arrêter.

280
outis

Quand PHP est arrivé sur la scène, tout le monde a été impressionné par les principales différences entre Perl:

  1. Variables d'entrée déjà dans la portée globale, pas d'analyse ennuyeuse.
  2. Intégration HTML. Juste <?php ... ?> n'importe où. Pas de modèles ennuyeux.
  3. Messages d'erreur à l'écran. Pas d'erreur ennuyeuse journal pics.
  4. Facile à apprendre. Pas de lecture de livre ennuyeux.

Au fur et à mesure que le temps passait, tout le monde a appris qu'ils n'étaient pas un avantage, hehe ...

43
Your Common Sense

J'ai remarqué que la plupart des PHP vs pages Perl semblent être du type

PHP est meilleur que Perl car <insérez ici la raison boiteuse>

ilk, et font rarement des comparaisons raisonnables.

En ce qui concerne la syntaxe, vous trouverez PHP est souvent plus facile à comprendre que Perl, en particulier lorsque vous n’avez que peu d’expérience. Par exemple, couper une chaîne de blancs en début et en fin de PHP est tout simplement

$string = trim($string);

En Perl c'est le peu plus cryptique

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

(Je crois que cela est légèrement plus efficace qu'une capture et un remplacement d'une seule ligne, et aussi un peu plus compréhensible.) Cependant, même si PHP est souvent plus anglais, il montre parfois encore les racines en tant que wrapper pour le niveau C bas, par exemple, strpbrk et strspn sont probablement rarement utilisées, car la plupart des PHP dabblers écrivent leurs propres fonctions équivalentes pour quoi que ce soit) trop ésotérique, plutôt que de passer du temps à explorer le manuel, je m'interroge également sur les programmeurs pour qui l'anglais est une langue seconde, car tout le monde est sur un pied d'égalité avec des choses telles que Perl et doit apprendre à partir de zéro.

J'ai déjà mentionné le manuel. PHP a un bon manuel en ligne, et malheureusement, il en a besoin. Je me réfère encore de temps en temps pour des choses qui devraient être simples, telles que l'ordre des paramètres ou la convention de nommage des fonctions. Avec Perl , vous vous rendrez probablement compte que vous vous référez au manuel un lot dès que vous commencez et qu’un jour vous aurez un A-ha moment et ne plus jamais en avoir besoin. Eh bien, du moins pas avant que vous ne soyez plus avancé et que vous réalisiez que non seulement il y a plus d'un moyen, il y a probablement un meilleur moyen, quelqu'un d'autre l'a déjà probablement fait fait cela mieux, et peut-être devriez-vous simplement visiter CPAN.

Perl a beaucoup plus d'options et de moyens d'exprimer les choses. Ce n'est pas nécessairement une bonne chose, même si cela permet au code d'être plus lisible s'il est utilisé à bon escient et au moins comme un des moyens que vous connaissez probablement. Vous tomberez dans certains styles et certains idiomes et je vous recommande vivement de lire Meilleures pratiques Perl (plus tôt que plus tard), ainsi que Livre de recettes Perl, Deuxième édition = se mettre au courant de la résolution des problèmes courants.

Je crois que la raison pour laquelle Perl est moins utilisé dans les environnements d'hébergement partagé est que, traditionnellement, la lenteur perçue de CGI et la réticence des hôtes à installer mod_Perl en raison de problèmes de sécurité et de configuration ont fait PHP Une option plus attrayante. Le cycle a ensuite continué, plus de gens ont appris à utiliser PHP parce que plus d’hôtes l’offraient et plus d’offres l’offraient parce que c’était ce que les gens voulaient utiliser. Les différences de vitesse et les problèmes de sécurité sont rendus sans objet par FastCGI ces jours-ci, et dans la plupart des cas PHP fonctionne également avec FastCGI, plutôt que de le laisser dans le coeur du Web serveur.

Que ce soit ou non le cas ou pour d'autres raisons, PHP est devenu populaire et une myriade d'applications y ont été écrites. Pour la majorité des personnes qui souhaitent simplement un site Web un simple blog ou une galerie de photos, PHP est tout ce dont ils ont besoin, c’est ce que promeuvent les hôtes. Rien ne devrait vous empêcher d’utiliser Perl (ou autre chose de votre choix) si vous le souhaitez.

Au niveau de l'entreprise, je doute que vous trouviez trop PHP en production (et s'il vous plaît, aucun point particulier à ) sur Facebook en tant que contre- Par exemple, j'ai dit niveau de l'entreprise ).

21
Duncan

Ce que je préfère à propos de Perl, c'est la façon dont il gère les tableaux/listes. Voici un exemple de création et d'utilisation d'une fonction Perl (ou "sous-routine"), qui utilise ceci pour les arguments:

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

Dans PHP, vous pourriez faire la même chose avec list(), mais ce n'est pas tout à fait pareil; en Perl, les tableaux et les tableaux sont en fait traités de la même manière (généralement). Vous pouvez aussi faire des choses comme:

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

Et une autre différence que vous DEVEZ connaître est celle des opérateurs de comparaison numérique/chaîne. En Perl, si vous utilisez <, >, ==, !=, <=>, Etc., Perl convertit les deux opérandes en Nombres. Si vous voulez plutôt convertir en chaînes, vous devez utiliser lt, gt, eq, ne, cmp (les noms respectifs équivalents des opérateurs énumérés précédemment). Exemples où cela vous mènera vraiment:

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

Perl est beaucoup utilisé pour les sites Web, pas moins que Python et Ruby par exemple. Cela dit, PHP est utilisé de manière Je pense que les facteurs les plus importants en sont la facilité de déploiement de PHP et sa facilité de démarrage.

Les différences de syntaxe sont trop nombreuses pour être résumées ici, mais il est généralement vrai qu’il existe plus de façons de s’exprimer (ceci est connu sous le nom de TIMTWOTDI, il existe plus d’une façon de le faire).

9
Leon Timmermans

Je n'ai rien à ajouter à la réponse fantastique de outis, je veux seulement montrer la réponse à votre question:

Pourquoi Perl n'est-il plus très souvent utilisé pour les sites Web dynamiques? Qu'est-ce qui a rendu PHP plus populaire que cela?

S'il vous plaît vérifier d'abord quelques sites "Job Trends" - et vous pouvez faire le jugement seul.

comme vous pouvez le constater, Perl reste un leader, mais il est préférable pour les applications réelles, pas pour les jouets. :)

4
jm666