Ответ 1
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
)), которые выполняются. В отличие от PHPauto_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
.
- PHP автоматически предоставляет специальную переменную
- Perl поддерживает перегрузку оператора.
- Строго говоря, Perl не имеет многострочных комментариев, но система POD может использоваться для того же самого аффекта.
- В Perl
//
является оператором. В PHP это начало однострочного комментария. - До PHP 5.3 PHP имел ужасную поддержку анонимных функций (функция
create_function
) и не поддерживал закрытие. - PHP не имел ничего похожего на пакеты Perl до версии 5.3, в которой была введена namespaces.
- Возможно, встроенная поддержка исключений Perl почти не похожа на исключения на других языках, настолько, что они вряд ли кажутся исключениями. Вы оцениваете блок и проверяете значение
[email protected]
(eval
вместоtry
,die
вместоthrow
).ОшибкаTry::Tiny поддерживает исключения, поскольку вы их находите на других языках (а также некоторые другие модули, перечисленные в Error See Also).
PHP был вдохновлен Perl так же, как Phantom Рай был вдохновлен Phantom Opera, или Strange Brew был вдохновлен Гамлетом. Лучше всего ставить специфику поведения PHP из вашего ума при изучении Perl, иначе вы столкнетесь.
Мой мозг болит сейчас, поэтому я остановлюсь.