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

101
задан Konerak 30 October 2011 в 10:25
поделиться

5 ответов

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

  • Perl имеет встроенную поддержку регулярных выражений, включая литералы regexp. PHP использует функции регулярных выражений Perl как расширение.
  • Perl имеет еще несколько операторов , включая сопоставление ( = ~ , ! ~ ), quote- например ( 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 (бар баз); 
     @ qux = ('qux', @foo, 'quux'); # @qux - это массив, содержащий 4 строки 
     @ bam = ('bug-AWWK!', \ @foo, 'fum'); # @bam содержит 3 элемента: две строки и массив 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 вы можете динамически изменять наследование с помощью переменной packages @ISA .
  • Perl поддерживает перегрузку операторов .
  • Строго говоря, Perl не имеет многострочных комментариев, но для того же эффекта можно использовать систему POD .
  • В Perl // - это оператор. В PHP это начало однострочного комментария.
  • До PHP 5.3 в PHP была ужасная поддержка анонимных функций (функция create_function ) и не было поддержки закрытий.
  • PHP не имел ничего похожего на пакеты Perl до версии 5.3, в которой были введены пространства имен .
  • Возможно, встроенная поддержка исключений Perl почти не похожа на исключения в других языках, настолько, что они едва ли кажутся исключениями. Вы оцениваете блок и проверяете значение $ @ ( eval вместо попробуйте , die вместо throw ]).Модуль Error Try :: Tiny поддерживает исключения, поскольку вы находите их на других языках (а также в некоторых других модулях, перечисленных в разделе Error, См. Также раздел ).

PHP был вдохновлен Perl так же, как Phantom of the Paradise был вдохновлен Phantom of the Opera , или Strange Brew был вдохновлен Гамлет . При изучении Perl лучше выбросить из головы особенности поведения PHP, иначе вы запутаетесь.

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

282
ответ дан 24 November 2019 в 04:35
поделиться

Когда на сцену вышел PHP, всех впечатлили основные отличия от Perl:

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

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

45
ответ дан 24 November 2019 в 04:35
поделиться

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

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

9
ответ дан 24 November 2019 в 04:35
поделиться

Мне больше всего нравится в 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.
9
ответ дан 24 November 2019 в 04:35
поделиться

Я заметил, что большинство страниц о 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 в качестве контрпримера, я сказал корпоративный уровень).

21
ответ дан 24 November 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: