Відмінності між Perl та PHP [закрито]


101

Я планую вивчити Perl 5, і оскільки до цього часу я використовував лише PHP, я хотів трохи дізнатися про те, як мови відрізняються одна від одної.

Оскільки PHP почався як набір "Perl hacks", він, очевидно, клонував деякі функції Perls.

  • Які основні відмінності у синтаксисі? Це правда, що у Perl у вас є більше варіантів і способів щось висловити?

  • Чому Perl вже не часто використовується для динамічних веб-сайтів? Що змусило PHP набути більшої популярності?


2
Цікаво, я мушу запитати: якщо ви можете вільно обирати свою другу мову після PHP, чому Perl замість більш сучасних Python чи Ruby?
jholster

37
Що є основою для того, щоб Python та Ruby були більш сучасними?
Джошуа Партогі

2
Я не думаю, що люди повинні намагатися порівнювати мови. Це призведе лише до плутанини.
Бен Шелок

11
@Ben: порівняння синтаксису має обмежену корисність. Порівняння функцій може допомогти у вивченні нових мов.
outis

1
Я вірю, що кожна мова має свою силу, виходячи з того, що передбачили дизайнери; особливо на основі набору випадків використання. Тому порівняння мов часто є упередженим і заплутаним
CodeAngel

Відповіді:


284

Perl і PHP відрізняються більше, ніж однакові. Розглянемо Perl 5, оскільки Perl 6 ще знаходиться на стадії розробки. Деякі відмінності, згруповані приблизно за темою:

  • Perl має підтримку регулярних виразів, включаючи літерали регулярного виразів. PHP використовує функції regexp Perl як розширення.
  • У Perl є ще декілька операторів , серед яких відповідність ( =~, !~), подібність цитатам ( qw, qxі c.), Експоненція ( **), повторення рядків ( x) та діапазон ( ..і ...). У PHP є кілька операторів, яких Perl не має, наприклад, оператор придушення помилок ( @), instanceof(хоча у Perl є Universal::isaметод) та clone.
  • У PHP newє оператором. У Perl це умовна назва підпрограми створення об'єкта, визначеної в пакунках, нічого особливого, що стосується мови.
  • Логічні оператори Perl повертають свої аргументи, в той час як вони повертають булі в PHP. Спробуйте:

    $foo = '' || 'bar';

    на кожній мові. У Perl ви навіть $foo ||= 'default'можете встановити значення $ foo, якщо воно ще не встановлено. Найкоротший спосіб зробити це в PHP $foo = isset($foo) ? $foo : 'default';(Оновлення, в PHP 7.0+ ви можете зробити $foo = $foo ?? 'default')

  • Імена змінних Perl вказують на вбудований тип, якого Perl має три, а специфікатор типу є частиною імені (називається " sigil "), тому $fooє іншою змінною, ніж @fooабо %foo.
  • (пов'язано з попереднім пунктом) Perl має окремі записи таблиць символів для скалярів, масивів, хешів, кодів, файлів / ручок та каталогів. У кожного є власний простір імен.
  • Perl надає доступ до таблиці символів , хоча маніпулювання цим не для слабкого серця. У PHP маніпулювання таблицею символів обмежується створенням посилань та extractфункції.
  • Зауважте, що "посилання" мають різний зміст у PHP та Perl. У PHP посилання - псевдоніми символьних таблиць. У Perl посилання - це розумні покажчики.
  • Perl має різні типи для цілочисельних індексованих колекцій (масивів) та колекцій, що індексуються рядком (хеші). У PHP вони одного типу: асоціативний масив / впорядкована карта .
  • Масиви Perl не є рідкісними: встановлення елемента з індексом, більшим за поточний розмір масиву, встановить всі втручаються елементи undefined(див. Perldata ). PHP-масиви рідкі; встановлення елемента не встановлює втручаються елементи.
  • Perl спочатку підтримує фрагменти хешу та масиву , а фрагменти призначені для призначення, що має всі види використання . У PHP ви використовуєте array_sliceдля витягування фрагмента та array_spliceпризначення його.
  • Ви можете залишити аргумент оператору підписки в PHP для трохи чарів. У Perl ви не можете залишити підпис.
  • Хеші Perl є не упорядкованими .
  • Perl має велику кількість заздалегідь визначених та магічних змінних . Заздалегідь задані змінні PHP мають зовсім інше призначення.
  • У Perl є модифікатори тверджень : деякі контрольні оператори можуть бути розміщені в кінці оператора.
  • Perl підтримує динамічне оцінювання за допомогою localключового слова.
  • Крім того, Perl має глобальний, лексичний (блок) та сферу застосування пакетів . PHP має глобальну, функціональну, об’єктну, класову та область імен .
  • У Perl змінні за замовчуванням є глобальними. У PHP змінні у функціях за замовчуванням є локальними.
  • Perl підтримує явні хвостові дзвінки через gotoфункцію.
  • Прототипи Perl забезпечують більш обмежену перевірку типу аргументів функції, ніж натяк на тип PHP . В результаті прототипи мають більш обмежену корисність, ніж натяки на тип.
  • У Perl останній оцінений оператор повертається як значення підпрограми, якщо оператор є виразом (тобто він має значення), навіть якщо оператор return не використовується. Якщо останнє твердження не є виразом (тобто не має значення), наприклад циклом, повернене значення не визначено (див. Perlsub ). У PHP, якщо явного повернення немає, значення повернення NULL .
  • Perl розгладжує списки (див. Perlsub ); для неплоских структур даних використовуйте посилання.

    @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 не згладжує масиви.

  • Perl має спеціальні кодові блоки ( BEGIN, UNITCHECK, CHECK, INITі END), які виконуються. На відміну від PHP auto_prepend_fileта auto_append_file, кількість номерів кожного коду не обмежується. Також кодові блоки визначаються в сценаріях, тоді як параметри PHP встановлюються у файлах конфігурації сервера та по каталогу.
  • У Perl крапка з комою відокремлює висловлювання . У PHP він припиняє їх, виключаючи, що тег закриття PHP ("?>") Також може припиняти оператор.
  • Значення виразів в Perl залежно від контексту .
  • Негативні підписки в Perl відносяться до кінця масиву. $bam[-1]є завершальним елементом масиву. Негативні підписки в PHP - це підписки, як і будь-які інші.
  • У Perl 5 класи засновані на пакетах і не схожі на класи на PHP (або на більшості інших мов). Perl 6 класи ближче до PHP-класів, але все-таки зовсім інші. (Perl 6 відрізняється від Perl 5 багатьма іншими способами, але це поза темою.) Багато відмінностей між Perl 5 та PHP виникають через те, що більшість функцій OO не вбудовані в Perl, а засновані на хаках. Наприклад, $obj->method(@args)перекладається на щось подібне (ref $obj)::method($obj, @args). Невичерпний список:
    • PHP автоматично забезпечує спеціальну змінну $thisв методах. Perl передає посилання на об'єкт як перший аргумент методів.
    • Perl вимагає посилання , які будуть благословенні , щоб створити об'єкт. Будь-яка посилання може бути благословлена ​​як екземпляр даного класу.
    • У Perl ви можете динамічно змінювати спадщину за допомогою @ISAзмінної пакетів .
  • Perl підтримує перевантаження оператора .
  • Строго кажучи, Perl не має багаторядкових коментарів, але система POD може бути використана для того ж впливу.
  • У Perl //є оператором. У PHP це початок однорядного коментаря.
  • До PHP 5.3, PHP мав жахливу підтримку анонімних функцій ( create_functionфункція) і не підтримував закриття.
  • PHP не мав нічого подібного до пакетів Perl до версії 5.3, яка представила простори імен .
  • Можливо, вбудована підтримка Perl для винятків майже не схожа на винятки в інших мовах, настільки, що вони ледве здаються винятками. Ви оцінюєте блок і перевіряєте значення $@( evalзамість try, dieа не throw). Модуль Error Try :: Tiny підтримує винятки, оскільки ви їх знайдете на інших мовах (а також деякі інші модулі, перелічені в розділі Помилка див. Також ).

PHP був натхненний Perl так само, як Phantom of Paradise був натхненний Phantom of the Opera , або Strange Brew був натхненний Гамлетом . Найкраще виключати з розуму специфіку поведінки PHP, коли ви вивчаєте Perl, інакше ви потрапите на сполох.

У мене зараз болить мозок, тож я зупинюсь.


21
Це фантастичний відповідь, і я відчуваю себе погано , що робить такий крихітний чіплятися на ньому, але ви тільки в основному праві масиви Perl. Коли у вас є @array = qw(a b c)і у вас є $array[4] = 'e', вміст масиву точно не є ('a', 'b', 'c', undef, 'e'); вони ('a', 'b', 'c', відсутні , 'e'). Тобто, [3]слот не містить вказівника на скаляр, який не є; він взагалі нічого не містить (і existsоператор тестує на це). Невелика різниця, але різниця. :)
варення

9
Людина, це одна з найкращих відповідей на те, що я коли-небудь бачив. Особливо частина про натхнення. Просто: круто і ІСТИЧНО. ;)
jm666

2
Найкоротший спосіб встановити значення, $fooякщо воно ще не встановленоisset($foo) || $foo='default';
alexbusu

45

Коли PHP вийшов на сцену, всі були вражені основними відмінностями від Perl:

  1. Вхідні змінні вже в глобальній області, без нудного розбору.
  2. Вбудовування HTML. Просто <?php ... ?>де завгодно. Без нудних шаблонів.
  3. Екранні повідомлення про помилки Немає нудних записів журналу помилок.
  4. Легко вчитися. Немає нудного читання книг.

З плином часу всі дізналися, що це не користь, хе-хе ...


21

Я помітив, що більшість сторінок PHP проти Perl здаються такими

PHP кращий за Perl, оскільки <вставте сюди кульгаву причину>

нереально і рідко проводять розумні порівняння.

Синтаксисно, ви зрозумієте, що PHP часто простіше зрозуміти, ніж Perl, особливо коли у вас мало досвіду. Наприклад, обрізка рядка провідних та кінцевих пробілів у PHP - це просто

$string = trim($string);

У Перлі це дещо дужче

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

(Я вважаю, що це трохи ефективніше, ніж збирання та заміна одного рядка, а також трохи зрозуміліше.) Однак, хоча PHP часто більш схожий на англійську мову, він іноді все ще показує коріння як обгортку для низького рівня C, наприклад, strpbrkі strspn, ймовірно, використовується рідко, тому що більшість даблерів PHP пишуть власні еквівалентні функції для чогось занадто езотеричного, а не витрачають час на вивчення посібника. Мені також цікаво, що програмісти, для яких англійська мова є другою мовою, оскільки всі нарівні з речами, такими як Perl, повинні вивчати це з нуля.

Я вже згадував посібник. PHP має чудовий онлайн-посібник, і, на жаль, йому це потрібно. Я все ще час від часу посилаюсь на це для речей, які мають бути простими, наприклад порядку порядку параметрів або функції іменування функції. З Perl, ви, ймовірно , знайдете ви маєте на увазі ручної в партії , як ви почали , а потім один день ви будете мати АГА момент і ніколи не знадобиться знову. Ну, принаймні, поки ви не будете більш просунуті і не зрозумієте, що не тільки є більше, ніж один спосіб, мабуть, є кращий шлях, хтось ще, мабуть, вже зробив це так краще, і, можливо, вам варто просто відвідати CPAN.

У Perl є набагато більше варіантів і способів висловити речі. Це не обов'язково є доброю справою, хоча дозволяє коду бути більш читабельним, якщо використовувати його з розумом та хоча б одним із способів, з якими ви, ймовірно, знайомі. Є певні стилі та ідіоми, в які ви потрапите, і я від душі рекомендую прочитати найкращі практики Perl (швидше, ніж пізніше), а також Perl Cookbook, Друге видання , щоб швидше вирішити загальні проблеми.

Я вважаю, що причина Perl використовується рідше в умовах спільного хостингу в тому, що історично сприйнята повільність CGI та небажання хостів встановлювати mod_perl через проблеми безпеки та конфігурації зробили PHP більш привабливим варіантом. Потім цикл продовжився, все більше людей навчилися використовувати PHP, тому що більшість господарів пропонували його, і більше хостів пропонували його, тому що саме цим хотіли користуватися люди. Різниці в швидкості та проблеми безпеки FastCGI в цей час видаються спірними , і в більшості випадків PHP також закінчується FastCGI, а не залишає його в ядрі веб-сервера.

Незалежно від того, чи ні, чи є інші причини, PHP став популярним і в ньому було записано безліч додатків. Для більшості людей, які просто хочуть веб-сайт початкового рівня з простим блогом чи галереєю фотографій, PHP - це все, що їм потрібно, тому саме це просувають хости. Нічого не заважає вам використовувати Perl (або що-небудь інше, що ви вибрали), якщо хочете.

На рівні підприємства я сумніваюся, що ви знайдете занадто багато PHP у виробництві (і, будь ласка, ніхто в Facebook не є прикладом, я сказав, що рівень підприємства ).


2
На щастя, хостинг стає простішим за допомогою хостингу FastCGI, який дає гідну продуктивність без ускладнень mod_perl.
Квентін

@David Dorward: Гаразд. Я говорив в історичному сенсі, оскільки FastCGI також забезпечує кращу продуктивність / безпеку, ніж mod_php. Я відредагую це, щоб спробувати зробити це ясніше.
Дункан

3
Ваш приклад оздоблення не має сенсу. Що краще 4 операторів або запам'ятовування всіх суперечливих параметрів і значень всіх PHP функцій , таких як Єрега ereg_replace eregi eregi_replace mb_ereg mb_ereg_replace mb_eregi mb_eregi_replace preg_match
Myforwik

3
Ваш приклад оздоблення Perl може бути набагато простішим:$str =~ s/^\s+|\s+$//g;
Франциско Зарабобозо,

1
@Myforwik, мій приклад оздоблення мав на меті продемонструвати, що Perl не має очевидних функцій, що може бентежити початківця. Як тільки ви засвоїте синтаксис, так, це набагато простіше, ніж боротися з усіма невідповідностями - я також зазначив, що постійно потрібно посібник.
Дункан

9

Perl використовується багато для веб-сайтів, не менше, ніж Python та Ruby, наприклад. Однак, PHP використовується набагато частіше, ніж будь-який із них. Я думаю, що найважливішими факторами в цьому є легкість розгортання PHP та легкість початку роботи.

Відмінностей у синтаксисі тут занадто багато, щоб підсумувати, але, як правило, правда, що у нього є більше способів виразити себе (це відомо як TIMTWOTDI. Існує більше, ніж один спосіб зробити це).


9

Моя улюблена річ щодо Perl - це те, як вона обробляє масиви / списки. Ось приклад того, як ви могли б створити та використовувати функцію Perl (або "підпрограму"), яка використовує це для аргументів:

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

У PHP ви могли б зробити аналогічну річ з list(), але це не зовсім те саме; у списках та масивах Perl насправді трактуються однаково (як правило). Ви також можете робити такі речі, як:

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

І ще одна відмінність, яку Ви ОБОВ'ЯЗКОВО знати, - це оператори порівняння чисел / рядків. У Perl, якщо ви використовуєте <, >, ==, !=, <=>, і так далі, Perl перетворює обидва операнда в числа. Якщо ви хочете , щоб перетворити як рядки замість цього, ви повинні використовувати lt, gt, eq, ne, cmp(відповідні еквіваленти операторів перерахованих вище). Приклади, де це дійсно отримає вас:

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

Масиви та списки зазвичай трактуються однаково.
Бред Гілберт

Так, правда. Думаю, я збирався це сказати, але забув. Відредаговано, щоб відобразити це.
crimson_penguin

4

Мені не потрібно нічого додавати до фантастичної відповіді outis, я хочу лише показати відповідь на ваше запитання:

Чому Perl вже не часто використовується для динамічних веб-сайтів? Що змусило PHP набути більшої популярності, ніж це?

Спочатку перегляньте кілька сайтів "Тенденції роботи" - і ви можете приймати судження самостійно.

як бачите, perl все ще залишається лідером - але кращим для реальних додатків, а не для іграшок. :)


1
Я думаю, що це порівняння також цікаве: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Sorin Postelnicu

1
Фіксована зламана посилання, будь ласка , використовуйте: simplyhired.com / ...
r4.

SH.com/a/jobtrends, здається, не існує. ВИКОРИСТОВУЙТЕ, будь ласка: простоhired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.

@ r4. ваші посилання не є такими ж, як оригінальне (зараз зламане) посилання. Оригінал показує графік (як і вище), а не деякі списки завдань. Перелік посилань на роботу не виходить за межі сфери.
jm666
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.