Perl и PHP сильно отличаются друг от друга. Давайте рассмотрим Perl 5, поскольку Perl 6 все еще находится в стадии разработки. Некоторые различия, сгруппированные примерно по темам:
= ~
, ! ~
), quote- например ( qw
, qx
и т. д.), возведение в степень ( **
), повторение строки ( x
) и диапазон ( ..
и ...
). В PHP есть несколько операторов, которых нет в Perl, например, оператор подавления ошибок ( @
), instanceof
(хотя Perl действительно имеет Universal :: isa
метод) и clone
. new
является оператором. В Perl это обычное имя подпрограммы создания объекта , определенной в пакетах, ничего особенного в том, что касается языка. Логические операторы Perl возвращают свои аргументы, тогда как они возвращают логические значения в PHP. Попробуйте:
$ foo = '' || 'bar';
на каждом языке. В Perl вы даже можете сделать $ foo || = 'default'
, чтобы установить для $ foo значение, если оно еще не установлено.Самый короткий способ сделать это в PHP - $ foo = isset ($ foo)? $ foo: 'default';
(Обновление, в PHP 7.0+ вы можете сделать $ foo = $ foo ?? 'default'
)
$ foo
- это переменная, отличная от ] @foo
или % foo
. extract
. undefined
(см. perldata ). Массивы PHP немногочисленны; установка элемента не будет устанавливать промежуточные элементы. array_slice
для извлечения фрагмента и array_splice
для назначения фрагменту. local
. goto
. Perl сглаживает списки (см. perlsub ); для не-уплощенные структуры данных, используйте ссылки.
@foo = qw (бар баз);
@ qux = ('qux', @foo, 'quux'); # @qux - это массив, содержащий 4 строки
@ bam = ('bug-AWWK!', \ @foo, 'fum'); # @bam содержит 3 элемента: две строки и массив ref
PHP не выравнивает массивы.
BEGIN
, UNITCHECK
, CHECK
, INIT
и ] END
), которые выполняются. В отличие от PHP auto_prepend_file
и auto_append_file
, нет ограничений на количество блоков кода каждого типа. Кроме того, блоки кода определяются в сценариях, тогда как параметры PHP устанавливаются в конфигурационных файлах сервера и для каждого каталога. $ bam [-1]
- последний элемент массива. Отрицательные индексы в PHP - это индексы, как и любые другие. $ obj-> method (@args)
преобразуется во что-то вроде (ref $ obj) :: method ($ obj, @args)
. Неполный список:
$ this
в методах. Perl передает ссылку на объект в качестве первого аргумента методов. @ISA
. //
- это оператор. В PHP это начало однострочного комментария. create_function
) и не было поддержки закрытий. $ @
( eval
вместо попробуйте
, die
вместо throw
]).Модуль PHP был вдохновлен Perl так же, как Phantom of the Paradise был вдохновлен Phantom of the Opera , или Strange Brew был вдохновлен Гамлет . При изучении Perl лучше выбросить из головы особенности поведения PHP, иначе вы запутаетесь.
У меня сейчас болит мозг, поэтому я собираюсь остановиться.
Когда на сцену вышел PHP, всех впечатлили основные отличия от Perl:
Php ...?>
где угодно. Никаких скучных шаблонов. Со временем все узнали, что они не приносили выгоды, хе-хе ...
Perl широко используется для веб-сайтов, не меньше, чем Python и Ruby, например. Тем не менее, PHP используется гораздо чаще, чем любой из них. Я думаю, что наиболее важными факторами здесь являются простота развертывания PHP и легкость его использования.
Различия в синтаксисе слишком велики, чтобы здесь резюмировать, но в целом верно, что у него есть больше способов выразить себя (это известно как TIMTWOTDI, есть более одного способа сделать это).
Мне больше всего нравится в 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.
Я заметил, что большинство страниц о 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 в качестве контрпримера, я сказал корпоративный уровень).