Различия между Perl и PHP

79

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

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

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

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

  • 2
    Будучи любопытным, я должен спросить: если вы можете свободно выбирать второй язык после PHP, почему Perl вместо более современного Python или Ruby?
  • 36
    На чем основаны Python и Ruby, чтобы быть более современными?
Показать ещё 6 комментариев
Теги:

6 ответов

253

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

  • Perl имеет встроенную поддержку регулярных выражений, включая литералы regexp. PHP использует функции regexp Perl как расширение.
  • Perl имеет еще несколько операторов , включая соответствие (=~, !~), quote-like (qw, qx & c.), exponentiation (**), строковое повторение (x) и range (.. и ...). PHP имеет несколько операторов Perl, например, оператор подавления ошибок (@), instanceof (хотя Perl имеет метод Universal::isa) и clone,
  • В PHP new является оператором. В Perl это условное имя подпрограмма создания объектов, определенная в пакетах, ничего особенного в том, что касается языка.
  • Логические операторы Perl возвращают свои аргументы, а возвращают логические значения в PHP. Попробуйте:

    $foo = '' || 'bar';
    

    на каждом языке. В Perl вы даже можете сделать $foo ||= 'default', чтобы установить $foo в значение, если оно еще не установлено. Самый короткий способ сделать это в PHP - $foo = isset($foo) ? $foo : 'default'; (Update, в PHP 7.0+ вы можете сделать $foo = $foo ?? 'default')

  • Perl имена переменных указывают на встроенный тип, из которых Perl имеет три, а спецификатор типа является частью имени (называемого "sigil "), поэтому $foo - это другая переменная, чем @foo или %foo.
  • (относящийся к предыдущей точке) Perl имеет отдельную таблицу символов для скаляров, массивов, хэшей, кода, файлов/каталогов и форматы. У каждого есть собственное пространство имен.
  • Perl предоставляет доступ к таблице символов хотя манипулирование ею не для слабонервных. В PHP манипуляция таблицами символов ограничивается созданием references и extract.
  • Обратите внимание, что "ссылки" имеют другое значение в PHP и Perl. В PHP references являются псевдонимами таблиц символов. В Perl ссылки являются интеллектуальными указателями.
  • Perl имеет разные типы для целых индексированных коллекций (массивов) и строковых индексированных коллекций (хэшей). В PHP они однотипны: ассоциативный массив/упорядоченная карта.
  • Массивы Perl не являются разреженными: установка элемента с индексом, большим, чем текущий размер массива, устанавливает все промежуточные элементы в undefined (см. perldata). Массивы PHP разрежены; установка элемента не будет устанавливать промежуточные элементы.
  • Perl поддерживает хеш и массив slices изначально, а срезы назначаются, у которых есть всевозможные использует. В PHP вы используете array_slice для извлечения фрагмента и array_splice, чтобы назначить срез.
  • Вы можете оставить аргумент для оператора индексирования в PHP для немного волшебства. В Perl вы не можете игнорировать индекс.
  • Хеши Perl неупорядоченные.
  • Perl имеет большое количество предопределенных и магических переменных. PHP предопределенные переменные имеют совершенно другую цель.
  • Perl имеет модификаторы операторов: некоторые операторы управления могут быть помещены в конец инструкции.
  • Perl поддерживает динамическое масштабирование с помощью ключевого слова local.
  • Кроме того, Perl имеет глобальный, лексический (блок) и пакет область, PHP имеет глобальный, функциональный, объект, класс и пространство имен scope.
  • В Perl переменные по умолчанию глобальны. В PHP переменные в функциях по умолчанию являются локальными.
  • Perl поддерживает явные хвостовые вызовы через goto.
  • Perl prototypes обеспечивает более ограниченную проверку типов для аргументов функции, чем 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 close ( "? > " ) Также может завершать инструкцию.
  • Значение выражений в 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 требует ссылки blessed. Любая ссылка может быть благословлена ​​как экземпляр данного класса.
    • В Perl вы можете динамически изменять наследование через переменную пакетов @ISA.
  • Perl поддерживает перегрузку оператора.
  • Строго говоря, Perl не имеет многострочных комментариев, но система POD может использоваться для того же самого аффекта.
  • В Perl // является оператором. В PHP это начало однострочного комментария.
  • До PHP 5.3 PHP имел ужасную поддержку анонимных функций (функция create_function) и не поддерживал закрытие.
  • PHP не имел ничего похожего на пакеты Perl до версии 5.3, в которой была введена namespaces.
  • Возможно, встроенная поддержка исключений Perl почти не похожа на исключения на других языках, настолько, что они вряд ли кажутся исключениями. Вы оцениваете блок и проверяете значение $@ (evalвместо try, die вместо throw). Ошибка Try::Tiny поддерживает исключения, поскольку вы их находите на других языках (а также некоторые другие модули, перечисленные в Error See Also).

PHP был вдохновлен Perl так же, как Phantom Рай был вдохновлен Phantom Opera, или Strange Brew был вдохновлен Гамлетом. Лучше всего ставить специфику поведения PHP из вашего ума при изучении Perl, иначе вы столкнетесь.

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

  • 21
    Это фантастический ответ, и я плохо себя чувствую, делая такой крошечный задира, но вы в основном правы относительно массивов Perl. Когда у вас есть @array = qw(abc) и вы делаете $array[4] = 'e' , содержимое массива не совсем точно ('a', 'b', 'c', undef, 'e') ; они ('a', 'b', 'c', несуществующие , 'e') . То есть слот [3] не содержит указатель на скаляр, который является undef; он вообще ничего не содержит (и для этого exists операторские тесты). Небольшая разница, но разница. :)
  • 8
    ЧЕЛОВЕК, это один из лучших ответов, что я когда-либо видел. Особенно часть о вдохновении. Просто: круто и ВЕРНО. ;)
Показать ещё 1 комментарий
39

Когда PHP появился на сцене, все были поражены основными отличиями от Perl:

  • Входные переменные уже находятся в глобальной области, без скучного разбора.
  • Вложение HTML. Просто <?php ... ?> где угодно. Нет скучных шаблонов.
  • Сообщения об ошибках на экране. Нет скучного журнала ошибок.
  • Легко учиться. Не скучно читать книги.

С течением времени все узнали, что они не были полезны, хе-хе...

17

Я заметил, что большинство страниц PHP и Perl, похоже, относятся к

PHP лучше, чем Perl, потому что < insert lame reason here >

ilk, и редко делают разумные сравнения.

Синтаксис, вы найдете PHP часто легче понять, чем Perl, особенно если у вас мало опыта. Например, обрезка строки ведущего и конечного пробелов в PHP просто

$string = trim($string);

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

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

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

Я уже упоминал руководство. PHP имеет прекрасное онлайн-руководство и, к сожалению, ему это нужно. Я по-прежнему отношусь к нему время от времени для вещей, которые должны быть простыми, таких как порядок параметров или соглашение об именовании функций. С Perl вы, вероятно, обнаружите, что по мере начала работы вы ссылаетесь на руководство a lot, а затем в один прекрасный день у вас будет момент a-ha и больше не понадобится. Ну, по крайней мере, пока вы не будете более продвинутыми и понимаете, что не только существует более одного пути, но, вероятно, есть лучший способ, кто-то еще, вероятно, уже сделал это лучше, и, возможно, вам стоит просто посетить 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.
  • 0
    @ Дэвид Дорвард: Хорошо. Я говорил в историческом смысле, так как FastCGI также дает лучшую производительность / безопасность, чем mod_php. Я отредактирую это, чтобы попытаться сделать это немного яснее.
Показать ещё 4 комментария
7

Моя любимая вещь о 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.
  • 0
    Массивы и списки обычно обрабатываются одинаково.
  • 0
    Да, верно. Я думаю, что собирался сказать это, но забыл. Отредактировано, чтобы отразить это.
7

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

Различий в синтаксисе слишком много, чтобы суммировать здесь, но, как правило, это правда, что у него есть больше способов выразить себя (это известно как TIMTWOTDI, есть больше, чем один способ сделать это).

4

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

Почему Perl не используется для динамического сайты очень часто больше? То, что сделал PHP получает большую популярность, чем он?

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

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

  • 1
    Я думаю, что это сравнение также интересно: www.simplyhired.com/a/jobtrends/trend/q-Perl,+Python,+PHP,+Ruby,+Java,+C%23,+C
  • 1
    Исправлена неработающая ссылка, ПОЖАЛУЙСТА, ИСПОЛЬЗУЙТЕ: simplyhired.com/…
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню