Różnice między Perlem i PHP [zamknięte]

101

Planuję nauczyć się Perla 5, a ponieważ do tej pory korzystałem tylko z PHP, chciałem dowiedzieć się trochę o tym, jak języki różnią się od siebie.

Gdy PHP zaczęło się jako zestaw "hacków Perla", oczywiście sklonował niektóre funkcje Perlsa.

  • Jakie są główne różnice w składni? Czy to prawda, że ​​z Perlem masz więcej opcji i sposobów wyrażenia czegoś?

  • Dlaczego Perl nie jest już bardzo często używany do dynamicznych witryn internetowych? Co sprawiło, że PHP zyskało większą popularność?

lok
źródło
2
Będąc zaciekawionym, muszę zapytać: jeśli możesz swobodnie wybrać swój drugi język po PHP, dlaczego Perl zamiast nowocześniejszego Pythona czy Rubiego?
jholster
37
Na jakiej podstawie Python i Ruby mają być bardziej nowoczesne?
Joshua Partogi
2
Nie sądzę, żeby ludzie próbowali porównywać języki. Doprowadzi to tylko do zamieszania.
Ben Shelock,
11
@Ben: porównywanie składni ma ograniczoną użyteczność. Porównanie funkcji może pomóc w nauce nowych języków.
wyjazd
1
Uważam, że każdy język ma swoją siłę wynikającą z tego, co przewidziali dla niego projektanci; szczególnie w oparciu o zestaw przypadków użycia. Dlatego porównywanie języków jest często stronnicze i mylące
CodeAngel

Odpowiedzi:

286

Perl i PHP różnią się bardziej niż podobne. Rozważmy Perl 5, ponieważ Perl 6 jest wciąż w fazie rozwoju. Niektóre różnice, z grubsza pogrupowane tematycznie:

  • Perl obsługuje natywne wyrażenia regularne, w tym literały regexp. PHP używa funkcji regexp Perla jako rozszerzenia.
  • Perl ma znacznie więcej operatorów , w tym dopasowywanie ( =~, !~), cudzysłowy ( qw, qx& c.), Potęgowanie ( **), powtórzenie ciągów ( x) i zakres ( ..i ...). PHP ma kilka operatorów, których Perl nie ma, na przykład operator eliminacji błędów ( @) instanceof(chociaż Perl ma Universal::isametodę) i clone.
  • W PHP newjest operatorem. W Perlu jest to konwencjonalna nazwa podprogramu tworzenia obiektów zdefiniowanego w pakietach, nic specjalnego, jeśli chodzi o język.
  • Operatory logiczne Perla zwracają swoje argumenty, podczas gdy w PHP zwracają wartości logiczne . Próbować:

    $foo = '' || 'bar';

    w każdym języku. W Perlu możesz nawet $foo ||= 'default'ustawić $ foo na wartość, jeśli nie jest jeszcze ustawiona. Najkrótszym sposobem na zrobienie tego w PHP jest $foo = isset($foo) ? $foo : 'default';(Aktualizacja, w PHP 7.0+ możesz to zrobić $foo = $foo ?? 'default')

  • Nazwy zmiennych Perla wskazują typ wbudowany, z których Perl ma trzy, a specyfikator typu jest częścią nazwy (zwany „ sigil ”), więc $foojest inną zmienną niż @foolub %foo.
  • (związane z poprzednim punktem) Perl ma osobne wpisy w tablicy symboli dla skalarów, tablic, skrótów, kodu, uchwytów plików / katalogów i formatów. Każdy ma własną przestrzeń nazw.
  • Perl daje dostęp do tablicy symboli , chociaż manipulowanie nią nie jest dla osób o słabym sercu. W PHP manipulacja tablicą symboli ogranicza się do tworzenia odniesień i extractfunkcji.
  • Zauważ, że „referencje” mają inne znaczenie w PHP i Perlu. W PHP referencjami są aliasy tablic symboli. W Perlu odniesienia są inteligentnymi wskaźnikami.
  • Perl ma różne typy kolekcji indeksowanych liczbami całkowitymi (tablice) i kolekcji indeksowanych ciągami znaków (hashy). W PHP są tego samego typu: tablica asocjacyjna / uporządkowana mapa .
  • Tablice Perla nie są rzadkie: ustawienie elementu z indeksem większym niż bieżący rozmiar tablicy spowoduje ustawienie wszystkich elementów interweniujących na undefined(patrz perldata ). Tablice PHP są rzadkie; ustawienie elementu nie ustawi elementów interweniujących.
  • Perl natywnie obsługuje haszowanie i tablice plasterków , a plasterki są przypisywalne, co ma wiele zastosowań . W PHP używasz array_slicedo wyodrębniania plastra i array_spliceprzypisywania do plasterka.
  • Możesz pominąć argument operatora indeksu w PHP dla odrobiny magii. W Perlu nie możesz pominąć indeksu dolnego.
  • Hashy Perla są nieuporządkowane .
  • Perl ma dużą liczbę predefiniowanych i magicznych zmiennych . Predefiniowane zmienne PHP mają zupełnie inny cel.
  • Perl ma modyfikatory instrukcji : niektóre instrukcje sterujące można umieścić na końcu instrukcji.
  • Perl obsługuje dynamiczne określanie zakresu za pomocą localsłowa kluczowego.
  • Ponadto Perl ma zasięg globalny, leksykalny (blokowy) i pakietowy . PHP ma zasięg globalny, funkcji, obiektu, klasy i przestrzeni nazw .
  • W Perlu zmienne są domyślnie globalne. W PHP zmienne w funkcjach są domyślnie lokalne.
  • Perl obsługuje jawne wywołania ogona poprzez gotofunkcję.
  • Prototypy Perla zapewniają bardziej ograniczone sprawdzanie typów argumentów funkcji niż podpowiedzi typu PHP . W rezultacie prototypy mają mniejszą użyteczność niż podpowiedzi typu.
  • W Perlu, ostatnia obliczona instrukcja jest zwracana jako wartość podprogramu, jeśli instrukcja jest wyrażeniem (tj. Ma wartość), nawet jeśli instrukcja return nie jest używana. Jeśli ostatnia instrukcja nie jest wyrażeniem (tj. Nie ma wartości), na przykład pętla, wartość zwracana jest nieokreślona (patrz perlsub ). W PHP, jeśli nie ma wyraźnego zwrotu, wartością zwracaną jest NULL .
  • Perl spłaszcza listy (zobacz perlsub ); w przypadku niespłaszczonych struktur danych użyj odniesień.

    @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 nie spłaszcza tablic.

  • Perl posiada specjalne bloki kodu ( BEGIN, UNITCHECK, CHECK, INITi END), które są wykonywane. W przeciwieństwie do PHP auto_prepend_filei auto_append_file, nie ma ograniczeń co do liczby bloków kodu każdego typu. Ponadto bloki kodu są definiowane w skryptach, podczas gdy opcje PHP są ustawiane w plikach konfiguracyjnych serwera i poszczególnych katalogów.
  • W Perlu średnik oddziela instrukcje . W PHP kończy je, z wyjątkiem tego, że znacznik zamykający PHP ("?>") Może również zakończyć instrukcję.
  • Wartość wyrażeń w Perlu zależy od kontekstu .
  • Ujemne indeksy w Perlu odnoszą się do końca tablicy. $bam[-1]jest ostatnim elementem tablicy. Negatywne indeksy dolne w PHP są indeksami takimi jak inne.
  • W Perlu 5 klasy są oparte na pakietach i w niczym nie przypominają klas w PHP (lub większości innych języków). Klasy Perl 6 są bliższe klasom PHP, ale wciąż są całkiem inne. (Perl 6 różni się od Perla 5 pod wieloma innymi względami, ale to jest poza tematem). Wiele różnic między Perlem 5 i PHP wynika z faktu, że większość funkcji obiektowych nie jest wbudowanych w Perl, ale opiera się na hackach. Na przykład $obj->method(@args)zostanie przetłumaczony na coś takiego jak (ref $obj)::method($obj, @args). Niewyczerpująca lista:
    • PHP automatycznie udostępnia specjalną zmienną $thisw metodach. Perl przekazuje referencję do obiektu jako pierwszy argument do metod.
    • Perl wymaga, aby odniesienia były błogosławione do tworzenia obiektu. Każde odniesienie może zostać pobłogosławione jako instancja danej klasy.
    • W Perlu możesz dynamicznie zmieniać dziedziczenie za pomocą @ISAzmiennej packages .
  • Perl obsługuje przeciążanie operatorów .
  • Ściśle mówiąc, Perl nie ma komentarzy wielowierszowych, ale system POD może być użyty do tego samego efektu.
  • W Perlu //jest operatorem. W PHP jest to początek jednowierszowego komentarza.
  • Aż do PHP 5.3, PHP miało straszne wsparcie dla funkcji anonimowych ( create_functionfunkcji) i nie było wsparcia dla zamknięć.
  • PHP nie miało nic podobnego do pakietów Perla aż do wersji 5.3, która wprowadziła przestrzenie nazw .
  • Prawdopodobnie wbudowana obsługa wyjątków w Perlu nie przypomina wyjątków w innych językach, do tego stopnia, że ​​prawie nie wyglądają jak wyjątki. Oceniasz blok i sprawdzasz wartość $@( evalzamiast try, diezamiast throw). Moduł Error Try :: Tiny obsługuje wyjątki, które można znaleźć w innych językach (a także niektóre inne moduły wymienione w sekcji Error's See Also ).

PHP zostało zainspirowane Perlem w taki sam sposób, w jaki Phantom of the Paradise został zainspirowany Phantom of the Opera , czy Strange Brew został zainspirowany Hamletem . Podczas nauki języka Perl najlepiej jest zapomnieć o zachowaniach PHP, bo inaczej wpadniesz w błąd.

Boli mnie teraz mózg, więc przestanę.

poza
źródło
21
To fantastyczna odpowiedź i źle się czuję, robiąc tak mały czubek, ale ty jesteś tylko przeważnie rację tablic Perla. Kiedy masz @array = qw(a b c)i robisz $array[4] = 'e', zawartość tablicy nie jest dokładnie ('a', 'b', 'c', undef, 'e'); oni ('a', 'b', 'c', nie istnieją , 'e'). Oznacza to, że [3]slot nie zawiera wskaźnika do skalara, który jest undef; w ogóle nic nie zawiera (a existsoperator sprawdza to). Mała różnica, ale różnica. :)
hobbs
9
MAN, to jedna z NAJLEPSZYCH odpowiedzi, jakie kiedykolwiek widziałem. Zwłaszcza część dotycząca inspiracji. Po prostu: fajne i PRAWDZIWE. ;)
jm666
2
Najkrótszym sposobem na ustawienie wartości, $foojeśli nie jest jeszcze ustawiona, może byćisset($foo) || $foo='default';
alexbusu
45

Kiedy PHP pojawił się na scenie, wszyscy byli pod wrażeniem głównych różnic w stosunku do Perla:

  1. Zmienne wejściowe są już w zasięgu globalnym, bez nudnego analizowania.
  2. Osadzanie HTML. Po prostu <?php ... ?>wszędzie. Żadnych nudnych szablonów.
  3. Komunikaty o błędach na ekranie. Brak nudnych podglądów dziennika błędów.
  4. Łatwe do nauki. Żadnego nudnego czytania książek.

Z biegiem czasu wszyscy nauczyli się, że nie są korzyścią, hehe ...

Twój zdrowy rozsądek
źródło
21

Zauważyłem, że większość stron PHP i Perl wydaje się mieć rozszerzenie

PHP jest lepsze niż Perl, ponieważ <wstaw tu kiepski powód>

podobne i rzadko dokonują rozsądnych porównań.

Jeśli chodzi o składnię, przekonasz się, że PHP jest często łatwiejsze do zrozumienia niż Perl, szczególnie jeśli masz niewielkie doświadczenie. Na przykład, przycinanie ciągu początkowych i końcowych białych znaków w PHP jest proste

$string = trim($string);

W Perlu jest to nieco bardziej tajemnicze

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

(Uważam, że jest to nieco bardziej wydajne niż przechwytywanie i zastępowanie pojedynczej linii, a także trochę bardziej zrozumiałe). Jednak mimo że PHP jest często bardziej podobne do angielskiego, czasami nadal pokazuje swoje korzenie jako opakowanie dla niskiego poziomu C, na przykład, strpbrki strspnprawdopodobnie są rzadko używane, ponieważ większość amatorów PHP pisze własne równoważne funkcje dla czegoś zbyt ezoterycznego, zamiast spędzać czas na zgłębianiu podręcznika. Zastanawiam się też nad programistami, dla których angielski jest drugim językiem, ponieważ wszyscy są na równi z takimi rzeczami jak Perl, muszą uczyć się go od podstaw.

Wspomniałem już o instrukcji. PHP ma dobrą instrukcję online i niestety jej potrzebuje. Nadal odwołuję się od czasu do czasu w sprawach, które powinny być proste, takie jak kolejność parametrów lub konwencja nazewnictwa funkcji. Z Perl, znajdziesz prawdopodobnie masz na myśli ręcznego w partii , jak zacząć, a potem pewnego dnia będziesz miał a-ha chwila i nigdy nie trzeba go ponownie. Cóż, przynajmniej nie, dopóki nie staniesz się bardziej zaawansowany i nie zdasz sobie sprawy, że nie tylko jest więcej niż jeden sposób, ale prawdopodobnie jest lepszy, ktoś inny prawdopodobnie już to zrobił w lepszy sposób i być może powinieneś po prostu odwiedzić CPAN.

Perl ma o wiele więcej opcji i sposobów wyrażania rzeczy. Niekoniecznie jest to dobra rzecz, chociaż pozwala na lepszą czytelność kodu, jeśli jest używany mądrze i co najmniej w jeden ze sposobów, które prawdopodobnie znasz. Są pewne style i idiomy, w które się wpadniesz, i serdecznie polecam przeczytanie Perl Best Practices (raczej prędzej niż później), wraz z Perl Cookbook, Second Edition , aby przyspieszyć rozwiązywanie typowych problemów.

Uważam, że przyczyną rzadszego używania Perla we współdzielonych środowiskach hostingowych jest to, że w przeszłości postrzegana powolność CGI i niechęć hostów do instalowania mod_perl ze względu na problemy z bezpieczeństwem i konfiguracją uczyniły PHP bardziej atrakcyjną opcją. Cykl był kontynuowany, więcej ludzi nauczyło się używać PHP, ponieważ oferowało go więcej hostów, a więcej hostów oferowało to, ponieważ ludzie chcieli tego używać. W dzisiejszych czasach FastCGI podważa różnice w szybkości i problemy z bezpieczeństwem , aw większości przypadków w PHP brakuje również FastCGI, zamiast pozostawiać je w rdzeniu serwera WWW.

Niezależnie od tego, czy tak jest, czy też są inne powody, PHP stało się popularne i zostało w nim napisanych mnóstwo aplikacji. Dla większości ludzi, którzy chcą mieć stronę internetową dla początkujących z prostym blogiem lub galerią zdjęć, PHP jest wszystkim, czego potrzebują, więc to właśnie promują gospodarze. Nic nie powinno powstrzymywać Cię przed używaniem Perla (lub czegokolwiek innego, co wybierzesz), jeśli chcesz.

Na poziomie przedsiębiorstwa wątpię, byś znalazł zbyt dużo PHP w produkcji (i proszę, nikt nie wskazał Facebooka jako kontrprzykładu, powiedziałem na poziomie przedsiębiorstwa ).

Duncan
źródło
2
Na szczęście hosting FastCGI staje się łatwiejszy, co zapewnia przyzwoitą wydajność bez komplikacji związanych z mod_perl.
Quentin
@David Dorward: OK. Mówiłem w sensie historycznym, ponieważ FastCGI zapewnia również lepszą wydajność / bezpieczeństwo niż mod_php. Zmienię to, aby było trochę jaśniejsze.
Duncan
3
Twój przykład wykończenia nie ma sensu. Co lepsze 4 operatorów lub pamiętanie wszystkich niespójnych parametrów i wartości zwrotu wszystkich funkcji PHP, takich jak 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
Twój przykład wykończenia Perla mógłby być znacznie prostszy:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo
1
@Myforwik, mój przykład przycinania miał na celu zademonstrowanie, że Perlowi brakuje oczywistych funkcji, co może być mylące dla początkującego. Kiedy już nauczysz się składni, tak, jest to znacznie łatwiejsze niż radzenie sobie ze wszystkimi niespójnościami - zwróciłem również uwagę na to, że potrzebuję instrukcji w sposób ciągły.
Duncan
9

Perl jest często używany w witrynach internetowych, nie mniej niż na przykład Python i Ruby. To powiedziawszy, PHP jest używane znacznie częściej niż którekolwiek z nich. Myślę, że najważniejszymi czynnikami są łatwość wdrożenia PHP i łatwość rozpoczęcia z nim.

Różnic w składni jest zbyt wiele, aby je tutaj podsumować, ale ogólnie jest prawdą, że ma więcej sposobów wyrażania siebie (jest to znane jako TIMTWOTDI, istnieje więcej niż jeden sposób, aby to zrobić).

Leon Timmermans
źródło
9

Moją ulubioną rzeczą w Perlu jest sposób, w jaki obsługuje on tablice / listy. Oto przykład, jak można utworzyć i używać funkcji Perla (lub „procedury podrzędnej”), która wykorzystuje to jako argumenty:

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

W PHP można by zrobić coś podobnego list(), ale to nie jest to samo; w Perlu listy i tablice są faktycznie traktowane tak samo (zwykle). Możesz też:

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

Kolejną różnicą, o której MUSISZ wiedzieć, są operatory porównania liczb / łańcuchów. W Perl, jeśli używasz <, >, ==, !=, <=>, i tak dalej, Perl konwertuje oba operandy do liczb. Jeśli chcesz przekonwertować jako ciągi zamiast tego trzeba użyć lt, gt, eq, ne, cmp(odpowiednie równoważniki podmioty wymienione wcześniej). Przykłady, w których to naprawdę Ci pomoże:

if ("a" == "b") { ... } # This is true.
if ("a" == 0) { ... } # This is also true, for the same reason.
crimson_penguin
źródło
Tablice i listy są zwykle traktowane tak samo.
Brad Gilbert
Tak, prawda. Myślę, że chciałem to powiedzieć, ale zapomniałem. Edytowano, aby to odzwierciedlić.
crimson_penguin
4

Nie muszę niczego dodawać do fantastycznej odpowiedzi outis, chcę tylko pokazać odpowiedź na Twoje pytanie:

Dlaczego Perl nie jest już bardzo często używany w dynamicznych witrynach internetowych? Co sprawiło, że PHP zyskało większą popularność niż to?

Najpierw sprawdź kilka witryn „Trendy w pracy” - i możesz samodzielnie dokonać oceny.

jak widać, Perl nadal jest liderem - ale preferowany do prawdziwych zastosowań, a nie do zabawek. :)

jm666
źródło
1
Myślę, że to porównanie jest również interesujące: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin Postelnicu
1
Naprawiono zepsuty link, PROSZĘ UŻYWAĆ: Simplyhired.com/ ...
r4.
Wydaje się, że SH.com/a/jobtrends nie istnieje. PROSZĘ UŻYWAĆ: Simplyhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.
@ r4. Twoje linki nie są takie same jak oryginalne (teraz uszkodzone) łącze. Oryginał pokazuje wykres (jak powyżej), a nie niektóre listy ofert pracy. Linki do ofert pracy są poza zakresem.
jm666