Unterschiede zwischen Perl und PHP [geschlossen]

101

Ich habe vor, Perl 5 zu lernen, und da ich bisher nur PHP verwendet habe, wollte ich ein bisschen wissen, wie sich die Sprachen voneinander unterscheiden.

Als PHP als eine Reihe von "Perl-Hacks" begann, hat es offensichtlich einige Perls-Funktionen geklont.

  • Was sind die Hauptunterschiede in der Syntax? Stimmt es, dass Sie mit Perl mehr Möglichkeiten und Möglichkeiten haben, etwas auszudrücken?

  • Warum wird Perl nicht mehr sehr oft für dynamische Websites verwendet? Was hat PHP immer beliebter gemacht?

lok
quelle
2
Da ich neugierig bin, muss ich fragen: Wenn Sie Ihre zweite Sprache nach PHP frei wählen können, warum Perl anstelle von modernerem Python oder Ruby?
Jholster
37
Was ist die Basis für Python und Ruby, um moderner zu sein?
Joshua Partogi
2
Ich denke nicht, dass die Leute versuchen sollten, Sprachen zu vergleichen. Es wird nur zu Verwirrung führen.
Ben Shelock
11
@ Ben: Das Vergleichen der Syntax ist nur begrenzt nützlich. Das Vergleichen von Funktionen kann beim Erlernen neuer Sprachen hilfreich sein.
Outis
1
Ich glaube, jede Sprache hat ihre Stärke basierend auf dem, was sich die Designer vorgestellt haben. insbesondere basierend auf einer Reihe von Anwendungsfällen. Daher ist das Vergleichen von Sprachen oft
voreingenommen

Antworten:

284

Perl und PHP unterscheiden sich mehr als gleich. Betrachten wir Perl 5, da sich Perl 6 noch in der Entwicklung befindet. Einige Unterschiede, grob nach Themen gruppiert:

  • Perl unterstützt native reguläre Ausdrücke, einschließlich regulärer Ausdrücke. PHP verwendet die Regexp-Funktionen von Perl als Erweiterung.
  • Perl hat einige weitere Operatoren , einschließlich Matching ( =~, !~), Zitat-like ( qw, qxusw.), Potenzierung ( **), String - Wiederholung ( x) und Reichweite ( ..und ...). PHP hat einige Operatoren, die Perl nicht hat, wie den Fehlerunterdrückungsoperator ( @) instanceof(obwohl Perl die Universal::isaMethode hat) und clone.
  • In PHP newist ein Operator. In Perl ist dies der herkömmliche Name einer in Paketen definierten Unterroutine zur Objekterstellung, die in Bezug auf die Sprache nichts Besonderes ist.
  • Logische Perl-Operatoren geben ihre Argumente zurück, während sie in PHP Boolesche Werte zurückgeben . Versuchen:

    $foo = '' || 'bar';

    in jeder Sprache. In Perl können Sie sogar $foo ||= 'default'$ foo auf einen Wert setzen, falls dieser noch nicht festgelegt ist. Der kürzeste Weg, dies in PHP zu tun, ist $foo = isset($foo) ? $foo : 'default';(Update, in PHP 7.0+ können Sie dies tun $foo = $foo ?? 'default')

  • Perl- Variablennamen geben den integrierten Typ an, von dem Perl drei hat, und der Typbezeichner ist Teil des Namens (als " Siegel " bezeichnet), also $fooeine andere Variable als @foooder %foo.
  • (bezogen auf den vorherigen Punkt) Perl verfügt über separate Symboltabelleneinträge für Skalare, Arrays, Hashes, Code, Datei- / Verzeichnishandles und Formate. Jeder hat seinen eigenen Namespace.
  • Perl bietet Zugriff auf die Symboltabelle , obwohl die Manipulation nichts für schwache Nerven ist. In PHP beschränkt sich die Manipulation von Symboltabellen auf das Erstellen von Referenzen und der extractFunktion.
  • Beachten Sie, dass "Referenzen" in PHP und Perl eine andere Bedeutung haben. In PHP sind Referenzen Symboltabellen-Aliase. In Perl sind Referenzen intelligente Zeiger.
  • Perl hat verschiedene Typen für Ganzzahl-indizierte Sammlungen (Arrays) und String-indizierte Sammlungen (Hashes). In PHP sind sie vom gleichen Typ: ein assoziatives Array / eine geordnete Karte .
  • Perl-Arrays sind nicht spärlich: Wenn Sie ein Element mit einem Index festlegen, der größer als die aktuelle Größe des Arrays ist, werden alle dazwischen liegenden Elemente auf gesetzt undefined(siehe Perldata ). PHP-Arrays sind spärlich; Durch das Setzen eines Elements werden keine dazwischenliegenden Elemente gesetzt.
  • Perl unterstützt nativ Hash- und Array- Slices , und Slices können zugewiesen werden, was alle möglichen Verwendungszwecke hat . In PHP array_sliceextrahieren Sie ein Slice und array_spliceweisen es einem Slice zu.
  • Sie können das Argument dem Indexoperator in PHP für ein bisschen Magie auslassen. In Perl können Sie den Index nicht auslassen.
  • Perl-Hashes sind ungeordnet .
  • Perl hat eine große Anzahl vordefinierter und magischer Variablen . Die vordefinierten Variablen von PHP haben einen ganz anderen Zweck.
  • Perl verfügt über Anweisungsmodifikatoren : Einige Steueranweisungen können am Ende einer Anweisung platziert werden.
  • Perl unterstützt das dynamische Scoping über das localSchlüsselwort.
  • Darüber hinaus hat Perl global, lexikalischen (Block) und Paketumfang . PHP hat einen globalen, Funktions-, Objekt-, Klassen- und Namespace- Bereich .
  • In Perl sind Variablen standardmäßig global. In PHP sind Variablen in Funktionen standardmäßig lokal.
  • Perl unterstützt explizite Tail-Aufrufe über die gotoFunktion.
  • Perls Prototypen bieten eine eingeschränktere Typprüfung für Funktionsargumente als PHPs Typhinweise . Infolgedessen sind Prototypen von geringerem Nutzen als Typhinweise.
  • In Perl wird die zuletzt ausgewertete Anweisung als Wert einer Unterroutine zurückgegeben, wenn die Anweisung ein Ausdruck ist (dh einen Wert hat), auch wenn keine return-Anweisung verwendet wird. Wenn die letzte Anweisung kein Ausdruck ist (dh keinen Wert hat), z. B. eine Schleife, ist der Rückgabewert nicht angegeben (siehe perlsub ). Wenn in PHP keine explizite Rückgabe erfolgt, ist der Rückgabewert NULL .
  • Perl glättet Listen (siehe Perlsub ); Verwenden Sie für nicht abgeflachte Datenstrukturen Referenzen.

    @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 reduziert Arrays nicht.

  • Perl hat spezielle Codeblocks ( BEGIN, UNITCHECK, CHECK, INITund END) , die ausgeführt werden. Im Gegensatz zu PHPs auto_prepend_fileund auto_append_filegibt es keine Begrenzung für die Anzahl der einzelnen Codeblocktypen. Außerdem werden die Codeblöcke in den Skripten definiert, während die PHP-Optionen in den Konfigurationsdateien für Server und pro Verzeichnis festgelegt werden.
  • In Perl trennt das Semikolon Anweisungen . In PHP werden sie beendet , mit der Ausnahme, dass ein PHP-Close-Tag ("?>") Auch eine Anweisung beenden kann.
  • Der Wert von Ausdrücken in Perl ist kontextsensitiv .
  • Negative Indizes in Perl beziehen sich auf das Ende des Arrays. $bam[-1]ist das letzte Element des Arrays. Negative Indizes in PHP sind Indizes wie alle anderen.
  • In Perl 5 basieren Klassen auf Paketen und sehen nicht wie Klassen in PHP (oder den meisten anderen Sprachen) aus. Perl 6-Klassen sind näher an PHP-Klassen, aber immer noch ganz anders. (Perl 6 unterscheidet sich in vielen anderen Punkten von Perl 5, aber das ist kein Thema.) Viele der Unterschiede zwischen Perl 5 und PHP ergeben sich aus der Tatsache, dass die meisten OO-Funktionen nicht in Perl integriert sind, sondern auf Hacks basieren. Wird zum Beispiel $obj->method(@args)in so etwas übersetzt (ref $obj)::method($obj, @args). Nicht erschöpfende Liste:
    • PHP stellt automatisch die spezielle Variable $thisin Methoden bereit . Perl übergibt einen Verweis auf das Objekt als erstes Argument an Methoden.
    • Perl erfordert, dass Referenzen gesegnet werden , um ein Objekt zu erstellen. Jede Referenz kann als Instanz einer bestimmten Klasse gesegnet werden.
    • In Perl können Sie die Vererbung über die Paketvariable dynamisch ändern @ISA.
  • Perl unterstützt das Überladen von Bedienern .
  • Genau genommen hat Perl keine mehrzeiligen Kommentare, aber das POD- System kann für den gleichen Effekt verwendet werden.
  • In Perl //ist ein Operator. In PHP beginnt ein einzeiliger Kommentar.
  • Bis PHP 5.3 hatte PHP schreckliche Unterstützung für anonyme Funktionen (die create_functionFunktion) und keine Unterstützung für Schließungen.
  • PHP hatte nichts wie Perls Pakete bis zur Version 5.3, in der Namespaces eingeführt wurden .
  • Wahrscheinlich sieht Perls integrierte Unterstützung für Ausnahmen fast nichts wie Ausnahmen in anderen Sprachen aus, so dass sie kaum wie Ausnahmen erscheinen. Sie werten einen Block aus und überprüfen den Wert von $@( evalanstelle von try, dieanstelle von throw). Das Error Try :: Tiny- Modul unterstützt Ausnahmen, da Sie sie in anderen Sprachen finden (sowie einige andere Module, die im Abschnitt Siehe auch Siehe Fehler aufgeführt sind ).

PHP wurde von Perl genauso inspiriert wie Phantom of the Paradise von Phantom of the Opera oder Strange Brew von Hamlet . Es ist am besten, die Verhaltensspezifikationen von PHP beim Lernen von Perl aus dem Kopf zu verlieren, sonst werden Sie gestolpert.

Mein Gehirn tut jetzt weh, also werde ich aufhören.

outis
quelle
21
Dies ist eine fantastische Antwort, und ich fühle mich schlecht, wenn ich so einen winzigen Trottel drauf mache, aber Sie haben nur größtenteils Recht mit Perl-Arrays. Wenn Sie haben @array = qw(a b c)und Sie tun $array[4] = 'e', ist der Inhalt des Arrays nicht genau ('a', 'b', 'c', undef, 'e'); sie sind ('a', 'b', 'c', nicht vorhanden , 'e'). Das heißt, der [3]Slot enthält keinen Zeiger auf einen Skalar, der undef ist. es enthält überhaupt nichts (und der existsBediener testet dies). Ein kleiner Unterschied, aber ein Unterschied. :)
Hobbs
9
MAN, das ist eine der BESTEN Antworten, die ich je gesehen habe. Besonders der Teil über die Inspiration. Einfach: cool und WAHR. ;)
jm666
2
Der kürzeste Weg, um einen Wert $fooisset($foo) || $foo='default';
festzulegen
45

Als PHP auf die Bühne kam, waren alle beeindruckt von den Hauptunterschieden zu Perl:

  1. Eingabevariablen bereits im globalen Bereich, keine langweilige Analyse.
  2. HTML-Einbettung. Einfach <?php ... ?>überall. Keine langweiligen Vorlagen.
  3. Fehlermeldungen auf dem Bildschirm. Kein langweiliger Fehlerprotokollblick.
  4. Leicht zu lernen. Kein langweiliges Buchlesen.

Im Laufe der Zeit erfuhren alle, dass sie kein Vorteil waren, hehe ...

Ihr gesunder Menschenverstand
quelle
21

Ich habe festgestellt, dass die meisten PHP- und Perl-Seiten von der Seite zu sein scheinen

PHP ist besser als Perl, weil <hier einen lahmen Grund einfügen>

ilk, und machen selten vernünftige Vergleiche.

In Bezug auf die Syntax werden Sie feststellen, dass PHP oft einfacher zu verstehen ist als Perl, insbesondere wenn Sie wenig Erfahrung haben. Das Trimmen einer Zeichenfolge führender und nachfolgender Leerzeichen in PHP ist beispielsweise einfach

$string = trim($string);

In Perl ist es etwas kryptischer

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

(Ich glaube, dies ist etwas effizienter als das Erfassen und Ersetzen einzelner Zeilen und auch ein wenig verständlicher.) Obwohl PHP oft englischer ist, zeigt es manchmal immer noch seine Wurzeln als Wrapper für Low Level C, Zum Beispiel strpbrkund strspnwerden wahrscheinlich selten verwendet, da die meisten PHP-Dabbler ihre eigenen äquivalenten Funktionen für etwas zu Esoterisches schreiben, anstatt Zeit damit zu verbringen, das Handbuch zu erkunden. Ich wundere mich auch über Programmierer, für die Englisch eine zweite Sprache ist, da jeder mit Dingen wie Perl gleichgestellt ist und es von Grund auf lernen muss.

Ich habe das Handbuch bereits erwähnt. PHP hat ein gutes Online-Handbuch und braucht es leider. Ich beziehe mich immer noch von Zeit zu Zeit auf Dinge, die einfach sein sollten, wie die Reihenfolge der Parameter oder die Namenskonvention für Funktionen. Mit Perl, werden Sie wahrscheinlich finden Sie in der Bedienungsanleitung ein beziehst viel wie Sie beginnen und dann eines Tages erhalten Sie eine haben a-ha Moment und es nie wieder brauchen. Nun, zumindest nicht, bis Sie fortgeschrittener sind und erkennen, dass es nicht nur mehr als einen Weg gibt, sondern wahrscheinlich auch einen besseren, jemand anderes hat es wahrscheinlich schon besser gemacht, und vielleicht sollten Sie einfach CPAN besuchen.

Perl hat viel mehr Möglichkeiten und Möglichkeiten, Dinge auszudrücken. Dies ist nicht unbedingt eine gute Sache, obwohl es Code ermöglicht, besser lesbar zu sein, wenn es mit Bedacht verwendet wird, und zumindest eine der Möglichkeiten, mit denen Sie wahrscheinlich vertraut sind. Es gibt bestimmte Stile und Redewendungen, in die Sie verfallen werden, und ich kann Ihnen wärmstens empfehlen, Perl Best Practices (eher früher als später) zusammen mit Perl Cookbook, Second Edition, zu lesen , um sich mit der Lösung häufiger Probleme vertraut zu machen.

Ich glaube, der Grund, warum Perl in gemeinsam genutzten Hosting-Umgebungen seltener verwendet wird, ist, dass PHP aufgrund der wahrgenommenen Langsamkeit von CGI und der mangelnden Bereitschaft von Hosts, mod_perl aufgrund von Sicherheits- und Konfigurationsproblemen zu installieren , PHP zu einer attraktiveren Option gemacht hat. Der Zyklus ging dann weiter, mehr Menschen lernten, PHP zu verwenden, weil mehr Hosts es anboten, und mehr Hosts boten es an, weil die Leute dies nutzen wollten. Die Geschwindigkeitsunterschiede und Sicherheitsprobleme werden heutzutage von FastCGI in Frage gestellt, und in den meisten Fällen wird PHP auch nicht mehr mit FastCGI betrieben, anstatt es im Kern des Webservers zu belassen.

Unabhängig davon, ob dies der Fall ist oder aus anderen Gründen, wurde PHP populär und es wurden unzählige Anwendungen darin geschrieben. Für die Mehrheit der Leute, die nur eine Einstiegswebsite mit einem einfachen Blog oder einer Fotogalerie wollen, ist PHP alles, was sie brauchen. Das ist es, was die Gastgeber fördern. Es sollte nichts Sie daran hindern, Perl (oder etwas anderes, das Sie wählen) zu verwenden, wenn Sie möchten.

Auf Unternehmensebene bezweifle ich, dass Sie zu viel PHP in der Produktion finden würden (und bitte, niemand auf Facebook als Gegenbeispiel, sagte ich auf Unternehmensebene ).

Duncan
quelle
2
Glücklicherweise wird es immer einfacher, Hosting mit FastCGI-Hosting zu erhalten, das eine anständige Leistung ohne die Komplikationen von mod_perl bietet.
Quentin
@ David Dorward: Okay. Ich habe im historischen Sinne gesprochen, da FastCGI auch eine bessere Leistung / Sicherheit bietet als mod_php. Ich werde das bearbeiten, um es ein bisschen klarer zu machen.
Duncan
3
Ihr Trimmbeispiel macht keinen Sinn. Was ist besser 4 - Betreiber oder alle der inkonsistenten Parameter und Rückgabewerte aller PHP - Funktionen zu erinnern, wie 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
Ihr Perl- $str =~ s/^\s+|\s+$//g;
Trimmbeispiel
1
@Myforwik, mein Trimmbeispiel sollte zeigen, dass Perl keine offensichtlichen Funktionen hat, was für Anfänger verwirrend sein kann. Sobald Sie die Syntax gelernt haben, ist es viel einfacher, als mit all den Inkonsistenzen umzugehen. Ich habe auch darauf hingewiesen, dass das Handbuch ständig benötigt wird.
Duncan
9

Perl wird häufig für Websites verwendet, nicht weniger als Python und Ruby. Trotzdem wird PHP viel häufiger verwendet als alle anderen. Ich denke, die wichtigsten Faktoren dafür sind die einfache Bereitstellung von PHP und die Leichtigkeit, damit zu beginnen.

Die Unterschiede in der Syntax sind zu groß, um sie hier zusammenzufassen, aber im Allgemeinen gibt es mehr Möglichkeiten, sich auszudrücken (dies wird als TIMTWOTDI bezeichnet, es gibt mehr als eine Möglichkeit, dies zu tun).

Leon Timmermans
quelle
9

Meine Lieblingssache bei Perl ist der Umgang mit Arrays / Listen. Hier ist ein Beispiel, wie Sie eine Perl-Funktion (oder "Unterroutine") erstellen und verwenden würden, die dies für Argumente verwendet:

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

In PHP könnten Sie etwas Ähnliches tun list(), aber es ist nicht ganz dasselbe. In Perl werden Listen und Arrays (normalerweise) tatsächlich gleich behandelt. Sie können auch Dinge tun wie:

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

Ein weiterer Unterschied, den Sie kennen müssen, sind numerische / String-Vergleichsoperatoren. Wenn Sie in Perl verwenden <, >, ==, !=, <=>, und so weiter, wandelt Perl beiden Operanden in Zahlen. Wenn Sie als Strings statt konvertieren wollen, müssen Sie verwenden lt, gt, eq, ne, cmp(die entsprechende Äquivalente der Betreiber zuvor aufgeführten). Beispiele, bei denen Sie dies wirklich erreichen:

if ("a" == "b") { ... } # This is true.
if ("a" == 0) { ... } # This is also true, for the same reason.
purpurroter_penguin
quelle
Arrays und Listen werden normalerweise gleich behandelt.
Brad Gilbert
Ja stimmt. Ich glaube, ich wollte das sagen, habe es aber vergessen. Bearbeitet, um das widerzuspiegeln.
Crimson_penguin
4

Ich muss der fantastischen Antwort von outis nichts hinzufügen, ich möchte nur die Antwort für Ihre Frage zeigen:

Warum wird Perl nicht mehr sehr oft für dynamische Websites verwendet? Was hat PHP populärer gemacht als es?

Bitte überprüfen Sie zuerst einige "Job Trends" -Seiten - und Sie können das Urteil alleine fällen.

Wie Sie sehen können, ist Perl immer noch führend - aber für echte Anwendungen vorzuziehen, nicht für Spielzeug. :) :)

jm666
quelle
1
Ich finde diesen Vergleich auch interessant: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin Postelnicu
1
Fehlerhafte
r4.
SH.com/a/jobtrends scheint nicht zu existieren. BITTE VERWENDEN
SIE
@ r4.Ihre Links sind nicht die gleichen wie die ursprünglichen (jetzt defekten) Links. Das Original zeigt eine Grafik (wie oben), nicht einige Joblisten. Joblisting-Links liegen außerhalb des Geltungsbereichs.
jm666