Différences entre Perl et PHP [fermé]

101

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 les différences entre les langages.

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

  • Quelles sont les principales différences de 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 utilisé très souvent pour les sites Web dynamiques? Qu'est-ce qui a rendu PHP plus populaire?

lok
la source
2
Étant curieux, je dois vous demander: si vous pouvez choisir librement votre deuxième langue après PHP, pourquoi Perl au lieu de Python ou Ruby plus modernes?
jholster
37
Quelle est la base pour que Python et Ruby soient plus modernes?
Joshua Partogi
2
Je ne pense pas que les gens devraient essayer de comparer les langues. Cela ne fera que semer la confusion.
Ben Shelock
11
@Ben: comparer la syntaxe a une utilité limitée. La comparaison des fonctionnalités peut aider à apprendre de nouvelles langues.
sortie
1
Je crois que chaque langue a sa force basée sur ce que les concepteurs ont envisagé pour elle; notamment basé sur un ensemble de cas d'utilisation. Par conséquent, comparer les langues est souvent biaisé et déroutant
CodeAngel

Réponses:

284

Perl et PHP sont plus différents que pareils. Considérons Perl 5, puisque Perl 6 est toujours en développement. Quelques différences, regroupées grossièrement par sujet:

  • Perl prend en charge les expressions régulières natives, y compris les littéraux regexp. PHP utilise les fonctions d'expression régulière de Perl comme extension.
  • Perl a un certain nombre d' opérateurs supplémentaires , y compris matching ( =~, !~), quote-like ( qw, qx& c.), Exponentiation ( **), string repetition ( x) et range ( ..and ...). PHP a quelques opérateurs que Perl n'a pas, tels que l' opérateur de suppression d'erreurs ( @), instanceof(bien que Perl ait la Universal::isaméthode) et clone.
  • En PHP, newest un opérateur. En Perl, c'est le nom conventionnel d'un sous-programme de création d'objets défini dans des packages, rien de spécial en ce qui concerne le langage.
  • Les opérateurs logiques Perl renvoient leurs arguments, tandis qu'ils renvoient des booléens en PHP. Essayer:

    $foo = '' || 'bar';

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

  • Les noms de variables Perl indiquent un type intégré, dont Perl en a trois, et le spécificateur de type fait partie du nom (appelé " sigil "), de même $fooqu'une variable différente de @fooou %foo.
  • (lié au point précédent) Perl a des entrées de table de symboles séparées pour les scalaires, les tableaux, les hachages, le code, les descripteurs de fichiers / répertoires et les formats. Chacun a son propre espace de noms.
  • Perl donne accès à la table des symboles , bien que la manipuler ne soit pas pour les âmes sensibles. En PHP, la manipulation des tables de symboles se limite à la création de références et de la extractfonction.
  • Notez que "références" a une signification différente en PHP et Perl. En PHP, les références sont des alias de table de symboles. En Perl, les références sont des pointeurs intelligents.
  • Perl a différents types pour les collections indexées sur des entiers (tableaux) et les collections indexées sur des chaînes (hachages). En PHP, ils sont du même type: un tableau associatif / une carte ordonnée .
  • Les tableaux Perl ne sont pas rares: définir un élément avec un index plus grand que la taille actuelle du tableau définira tous les éléments intermédiaires sur undefined(voir perldata ). Les tableaux PHP sont rares; définir un élément ne définira pas les éléments intermédiaires.
  • Perl prend en charge nativement les tranches de hachage et de tableau , et les tranches sont assignables, ce qui a toutes sortes d' utilisations . En PHP, vous utilisez array_slicepour extraire une tranche et l' array_spliceattribuer à une tranche.
  • Vous pouvez laisser de côté l' argument de l'opérateur indice en PHP pour un peu de magie. En Perl, vous ne pouvez pas omettre l'indice.
  • Les hachages Perl ne sont pas ordonnés .
  • Perl a un grand nombre de variables prédéfinies et magiques . Les variables prédéfinies de PHP ont un but très différent.
  • Perl a des modificateurs d'instruction : certaines instructions de contrôle peuvent être placées à la fin d'une instruction.
  • Perl prend en charge la portée dynamique via le localmot - clé.
  • De plus, Perl a une portée globale, lexicale (bloc) et package . PHP a une portée globale, fonction, objet, classe et espace de noms .
  • En Perl, les variables sont globales par défaut. En PHP, les variables dans les fonctions sont locales par défaut.
  • Perl prend en charge les appels de queue explicites via la gotofonction.
  • Les prototypes de Perl fournissent une vérification de type plus limitée pour les arguments de fonction que l'indication de type de PHP . En conséquence, les prototypes sont d'une utilité plus limitée que l'indication de type.
  • En Perl, la dernière instruction évaluée est retournée comme 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), comme 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, 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 possède des blocs de code spéciaux ( BEGIN, UNITCHECK, CHECK, INITet END) qui sont exécutées. Contrairement à PHP auto_prepend_fileet auto_append_file, il n'y a pas de limite au nombre de chaque type de bloc de code. De plus, les blocs de code sont définis dans les scripts, tandis que les options PHP sont définies dans les fichiers de configuration du serveur et par répertoire.
  • En Perl, le point-virgule sépare les instructions . En PHP, il les termine , sauf qu'une balise de fermeture 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 en PHP sont des indices comme les autres.
  • En Perl 5, les classes sont basées sur des packages et ne ressemblent en rien aux classes en PHP (ou dans la plupart des autres langages). Les classes Perl 6 sont plus proches des classes PHP, mais tout de même assez différentes. (Perl 6 est différent de Perl 5 à bien d'autres égards, mais c'est hors sujet.) La plupart des différences entre Perl 5 et PHP proviennent 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)se traduit par quelque chose comme (ref $obj)::method($obj, @args). Liste non exhaustive:
    • PHP fournit automatiquement la variable spéciale $thisdans les méthodes. Perl passe une référence à l'objet comme premier argument aux méthodes.
    • Perl a besoin de références pour être béni pour créer un objet. Toute référence peut être bénie en tant qu'instance d'une classe donnée.
    • En Perl, vous pouvez modifier dynamiquement l'héritage via la @ISAvariable packages .
  • Perl prend en charge la surcharge des opérateurs .
  • 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'à PHP 5.3, PHP avait un support terrible pour les fonctions anonymes (la create_functionfonction) et aucun support pour les fermetures.
  • PHP n'avait rien comme les paquets de Perl jusqu'à la version 5.3, qui introduisait les espaces de noms .
  • On peut soutenir que le support intégré de Perl pour les exceptions ne ressemble presque en rien aux exceptions dans d'autres langages, à tel point qu'elles ne semblent guère être des exceptions. Vous évaluez un bloc et vérifiez la valeur de $@( evalau lieu de try, dieau lieu de throw). Le module Error Try :: Tiny prend en charge les exceptions telles que vous les trouvez dans d'autres langues (ainsi que certains autres modules répertoriés dans la section Voir aussi Error ).

PHP a été inspiré par Perl de la même manière que Phantom of the Paradise a été inspiré par Phantom of the Opera , ou Strange Brew a été inspiré par Hamlet . Il est préférable de ne pas penser aux spécificités du comportement de PHP lorsque vous apprenez Perl, sinon vous serez trébuché.

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

outis
la source
21
C'est une réponse fantastique, et je me sens mal de faire un si petit pinaillage dessus, mais vous n'avez généralement raison que sur les tableaux Perl. Lorsque vous avez @array = qw(a b c)et que vous faites $array[4] = 'e', le contenu du tableau n'est pas exactement ('a', 'b', 'c', undef, 'e'); ils sont ('a', 'b', 'c', inexistants , 'e'). Autrement dit, le [3]slot ne contient pas de pointeur vers un scalaire qui est undef; il ne contient rien du tout (et l' existsopérateur le teste). Une petite différence, mais une différence. :)
hobbs
9
MAN, c'est l'une des MEILLEURES réponses que j'ai jamais vues. Surtout la partie sur l'inspiration. Simplement: cool et VRAI. ;)
jm666
2
Le moyen le plus court de définir une valeur $foosi elle n'est pas déjà définie peut êtreisset($foo) || $foo='default';
alexbusu
45

Lorsque PHP est entré en scène, tout le monde a été impressionné par les principales différences avec Perl:

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

Au fil du temps, tout le monde a appris qu'ils n'étaient pas un avantage, hehe ...

Votre bon sens
la source
21

J'ai remarqué que la plupart des pages PHP par rapport à Perl semblent être

PHP est meilleur que Perl car <insérer une raison boiteuse ici>

ilk, et font rarement des comparaisons raisonnables.

Sur le plan de la syntaxe, vous constaterez que PHP est souvent plus facile à comprendre que Perl, en particulier lorsque vous avez peu d'expérience. Par exemple, couper une chaîne d'espaces blancs de début et de fin en PHP est simplement

$string = trim($string);

En Perl, c'est le plus cryptique

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

(Je pense que c'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 ses racines comme un wrapper pour le bas niveau C, par exemple, strpbrket strspnsont probablement rarement utilisés, car la plupart des utilisateurs de PHP écrivent leurs propres fonctions équivalentes pour quelque chose de 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 deuxième langue, car tout le monde est sur un pied d'égalité avec des choses comme Perl, devant l'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. J'y fais encore référence de temps en temps pour des choses qui devraient être simples, comme l'ordre des paramètres ou la convention de dénomination des fonctions. Avec Perl, vous vous trouverez êtes probablement référence au manuel d' un lot que vous avez commencé et puis un jour , vous aurez une a-ha moment et jamais besoin de nouveau. Eh bien, du moins pas jusqu'à ce que vous soyez plus avancé et que vous vous rendiez compte que non seulement il y a plus d'un moyen, il y a probablement un meilleur moyen, quelqu'un d'autre l'a probablement déjà fait de la meilleure façon, et peut-être que vous devriez simplement visiter CPAN.

Perl a beaucoup plus d'options et de façons 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 de l'une des manières que vous êtes susceptible de connaître. Il y a certains styles et idiomes dans lesquels vous vous retrouverez, et je vous recommande vivement de lire les meilleures pratiques de Perl (le plus tôt possible), ainsi que Perl Cookbook, deuxième édition pour vous familiariser avec la résolution des problèmes courants.

Je pense que la raison pour laquelle Perl est moins utilisé dans les environnements d'hébergement partagé est qu'historiquement, 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 de PHP une option plus attrayante. Le cycle s'est ensuite poursuivi, plus de gens ont appris à utiliser PHP parce que plus d'hôtes l'ont proposé, et plus d'hôtes l'ont proposé parce que c'est ce que les gens voulaient utiliser. Les différences de vitesse et les problèmes de sécurité sont rendus évidents par FastCGI ces jours-ci, et dans la plupart des cas, PHP est également à court de FastCGI, plutôt que de le laisser au cœur du serveur Web.

Que ce soit le cas ou non ou qu'il y ait d'autres raisons, PHP est devenu populaire et une myriade d'applications y ont été écrites. Pour la majorité des gens qui veulent juste un site Web d'entrée de gamme avec un simple blog ou une galerie de photos, PHP est tout ce dont ils ont besoin, c'est ce que les hébergeurs font la promotion. Rien ne devrait vous empêcher d'utiliser Perl (ou tout autre élément de votre choix) si vous le souhaitez.

Au niveau de l'entreprise, je doute que vous trouviez trop de PHP en production (et s'il vous plaît, personne ne veut de Facebook comme contre-exemple, j'ai dit au niveau de l' entreprise ).

Duncan
la source
2
Heureusement, il devient plus facile d'obtenir un hébergement avec l'hébergement FastCGI qui offre des performances décentes sans les complications de mod_perl.
Quentin
@David Dorward: D'accord. Je parlais dans un sens historique, car FastCGI donne également de meilleures performances / sécurité que mod_php. Je vais le modifier pour essayer de le rendre un peu plus clair.
Duncan
3
Votre exemple de coupe n'a pas de sens. Ce qui est mieux 4 opérateurs ou à se rappeler tous les paramètres incompatibles et les valeurs de retour de toutes les fonctions PHP tels que 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_strpos mb_strrpos
Myforwik
3
Votre exemple de trim Perl pourrait être beaucoup plus simple:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo
1
@Myforwik, mon exemple de trim visait à démontrer que Perl manque de fonctions évidentes, ce qui peut être déroutant pour un débutant. Une fois que vous avez appris la syntaxe, oui, c'est beaucoup plus facile que de gérer toutes les incohérences - j'ai également souligné le besoin constant du manuel.
Duncan
9

Perl est beaucoup utilisé pour les sites Web, pas moins que Python et Ruby par exemple. Cela dit, PHP est utilisé beaucoup plus souvent que n'importe lequel d'entre eux. Je pense que les facteurs les plus importants sont la facilité de déploiement de PHP et la facilité de commencer avec lui.

Les différences de syntaxe sont trop nombreuses pour être résumées ici, mais il est généralement vrai qu'il y a plus de façons de s'exprimer (c'est ce qu'on appelle TIMTWOTDI, il y a plus d'une façon de le faire).

Léon Timmermans
la source
9

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 la façon dont vous créeriez et utiliseriez une fonction Perl (ou "sous-programme"), qui l'utilise pour les arguments:

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

En PHP, vous pouvez faire une chose similaire avec list(), mais ce n'est pas tout à fait la même chose; dans les listes et les tableaux Perl sont en fait traités de la même manière (généralement). Vous pouvez également 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, ce sont les opérateurs de comparaison numérique / chaîne. En Perl, si vous utilisez <, >, ==, !=, <=>, et ainsi de suite, Perl convertit les deux opérandes vers des numéros. Si vous voulez convertir en tant que chaînes à la place, vous devez utiliser lt, gt, eq, ne, cmp(les équivalents respectifs 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.
cramoisi_pingouin
la source
Les tableaux et les listes sont généralement traités de la même manière.
Brad Gilbert
Oui c'est vrai. Je pense que j'allais dire ça, mais j'ai oublié. Édité pour refléter cela.
crimson_penguin
4

Je n'ai pas besoin d'ajouter quoi que ce soit à la réponse fantastique d'Outis, je veux seulement montrer la réponse pour votre question:

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

Veuillez d'abord consulter quelques sites «Job Trends» - et vous pourrez vous prononcer seul.

comme vous pouvez le voir, perl est toujours un leader - mais préférable pour les applications réelles et non pour les jouets. :)

jm666
la source
1
Je pense que cette comparaison est également intéressante: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin Postelnicu
1
Correction du lien cassé, VEUILLEZ UTILISER: Simplyhired.com
r4.
SH.com/a/jobtrends ne semble pas exister. VEUILLEZ UTILISER: Simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.
@ r4.vos liens ne sont pas les mêmes que le lien d'origine (maintenant rompu). L'original montre un graphique (comme ci-dessus), pas des listes d'emplois. Les liens vers les offres d'emploi sont hors du champ d'application.
jm666