Различия между Perl и PHP [закрыто]

101

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

Поскольку PHP начинался как набор «Perl-хаков», он явно клонировал некоторые функции Perls.

  • Каковы основные различия в синтаксисе? Верно ли, что с Perl у вас есть больше возможностей и способов выразить что-то?

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

лок
источник
2
Из любопытства я должен спросить: если вы можете свободно выбирать второй язык после PHP, почему Perl вместо более современного Python или Ruby?
jholster
37
На чем основаны более современные Python и Ruby?
Джошуа Партоги
2
Я не думаю, что люди должны пытаться сравнивать языки. Это приведет только к путанице.
Бен Шелок
11
@Ben: сравнение синтаксиса имеет ограниченную полезность. Сравнение функций может помочь в изучении новых языков.
outis
1
Я считаю, что у каждого языка есть своя сила, основанная на том, что проектировщики предусмотрели для него; особенно на основе набора сценариев использования. Поэтому сравнение языков часто бывает необъективным и сбивает с толку
CodeAngel

Ответы:

286

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

  • Perl имеет встроенную поддержку регулярных выражений, включая литералы regexp. PHP использует функции регулярных выражений Perl в качестве расширения.
  • В Perl есть еще несколько операторов , включая сопоставление ( =~, !~), кавычки ( qw, qxи т. Д.), Возведение в степень ( **), повторение строки ( 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 имеет три, а спецификатор типа является частью имени (называемый " сигилом "), поэтому $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 последний вычисленный оператор возвращается как значение подпрограммы, если оператор является выражением (т. Е. Имеет значение), даже если оператор возврата не используется. Если последний оператор не является выражением (т.е. не имеет значения), например цикл, возвращаемое значение не указано (см. 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 возникают из-за того факта, что большинство объектно-ориентированных функций не встроены в 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 the Paradise был вдохновлен Phantom of the Opera , или Strange Brew был вдохновлен Гамлетом . При изучении Perl лучше забыть о особенностях поведения PHP, иначе вы запутаетесь.

У меня сейчас болит мозг, поэтому я собираюсь остановиться.

Outis
источник
21
Это фантастический ответ, и мне не нравится делать к нему такие крошечные придирки, но вы в основном правы только насчет массивов Perl. Когда у вас есть @array = qw(a b c)и вы делаете $array[4] = 'e', содержимое массива не совсем точно ('a', 'b', 'c', undef, 'e'); они ('a', 'b', 'c', отсутствуют , 'e'). То есть в [3]слоте нет указателя на скаляр undef; он вообще ничего не содержит (и existsоператор проверяет это). Небольшая разница, но разница. :)
hobbs
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);

В Perl это несколько более загадочный

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

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

Я уже упоминал руководство. У PHP есть прекрасное онлайн-руководство, и, к сожалению, оно ему необходимо. Я до сих пор время от времени обращаюсь к нему по поводу простых вещей, таких как порядок параметров или соглашение об именах функций. С Perl, вы, вероятно , найдете вы имеете в виду ручной в партии , как вы начали , а затем один день вы будете иметь АГА момент и никогда не понадобится снова. Что ж, по крайней мере, до тех пор, пока вы не станете более продвинутыми и не поймете, что не только существует более одного способа, но, вероятно, есть способ лучше, кто-то другой, вероятно, уже сделал это таким лучшим способом, и, возможно, вам просто стоит посетить CPAN.

У Perl гораздо больше возможностей и способов выразить вещи. Это не обязательно хорошо, хотя позволяет сделать код более читаемым, если использовать его с умом и, по крайней мере, одним из способов, с которым вы, вероятно, знакомы. Есть определенные стили и идиомы, в которые вы попадете, и я могу от всей души порекомендовать прочитать Perl Best Practices (раньше, чем позже) вместе с Perl Cookbook, Second Edition, чтобы быстро научиться решать типичные проблемы.

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

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

На уровне предприятия я сомневаюсь, что вы найдете слишком много PHP в производственной среде (и, пожалуйста, никто не указывает на Facebook в качестве контрпримера, я сказал на уровне предприятия ).

Дункан
источник
2
К счастью, становится проще получить хостинг с FastCGI-хостингом, который обеспечивает достойную производительность без осложнений, связанных с mod_perl.
Quentin
@ Дэвид Дорвард: Хорошо. Я говорил в историческом смысле, поскольку FastCGI также обеспечивает лучшую производительность / безопасность, чем mod_php. Я отредактирую это, чтобы попытаться сделать его немного понятнее.
Дункан
3
Ваш аккуратный пример не имеет смысла. Что лучше 4 операторов или запоминание всех противоречивых параметров и возвращаемых значений всех PHP функций , таких как Ерег 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
Ваш пример Perl-обрезки мог бы быть намного проще:$str =~ s/^\s+|\s+$//g;
Francisco Zarabozo
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
источник
Массивы и списки обычно обрабатываются одинаково.
Брэд Гилберт,
Да, верно. Думаю, я собирался это сказать, но забыл. Отредактировано, чтобы отразить это.
crimson_penguin
4

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

Почему Perl больше не используется для динамических веб-сайтов? Что сделало PHP более популярным?

Пожалуйста, проверьте сначала некоторые сайты "Тенденции вакансий" - и вы сможете принять решение самостоятельно.

Как видите, perl по-прежнему остается лидером - но предпочтительнее для реальных приложений, а не для игрушек. :)

jm666
источник
1
Думаю, это сравнение тоже интересно: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
Сорин Постельнику
1
Исправлена ​​неработающая ссылка, ПОЖАЛУЙСТА, ИСПОЛЬЗУЙТЕ: simplehired.com/…
r4.
SH.com/a/jobtrends, похоже, не существует. ПОЖАЛУЙСТА, ИСПОЛЬЗУЙТЕ: simplehired.com/search?q=Perl%2C%2BPython%2C%2BPHP%2C%2BRuby
r4.
@ r4. ваши ссылки не совпадают с исходной (теперь неработающей) ссылкой. В оригинале показан график (как показано выше), а не списки вакансий. Ссылки на вакансии выходят за рамки.
jm666 05