Переходим с PHP на Perl, как это ни печально...


Прислал: Дмитрий Котеров [ 06.02.2001 @ 13:51 ]
Раздел:: [ Статьи по Perl ]


Переходим с PHP на Perl, как это ни печально...

Оглавление

1. Сухой осадок ( http://webscript.ru/#cont0 )
2. Несколько слов о PHP ( http://webscript.ru/#cont1 )
3. О Perl ( http://webscript.ru/#cont2 )

ї1. Сухой осадок

          Многие в это не верят (я сам не верил), но Perl действительно лучше, чем PHP. Вот одна из лучших книг по Perl: "Стивен Холзнер. Perl: специальный справочник. Санкт-Петербург, издательство "Питер", 2000". Яснее, чем там, нигде не напишут...

ї2. Несколько слов о PHP

          PHP3, конечно, язык хороший... Во всяком случае, синтаксис у него на порядок проще и яснее, чем у Perl. И конструкций/инструкций меньше. Это достоинство. Например, в Паскале конструкций еще меньше, но это не мешает ему называться почти что одним из самых алгоритмизируемых языков.
          С чем очень неприятным сталкивается каждый программист, который переходит на Perl? Конечно, с тем, что ошибки скрипта выводятся в log-и сервера, на не прямо в браузер. И нельзя это никак переключить (есть, правда, один стандартный модуль с громким параметром fatalsToBrowser, но в browser он выводит только эти самые fatals, а предупреждения - по-прежнему в логи). В PHP ошибки по умолчанию выводятся туда же, куда и обычные данные.
          Следующее мерзкое свойство Perl - постоянно выдавать 500-ю ошибку. За подробностями, якобы, обращайтесь к логам сервера. Ага, сейчас... Причем эта самая 500-я ошибка выдается из-за того, что какой-то print проскочил раньше вывода заголовка "Content-type". В PHP никто не проскочит раньше его. Потому что там отслеживается: если что-то печатается, а заголовка нет, то вначале передается именно заголовок "Content-type".
          Теперь насчет управления переменными. В PHP любая переменная начинается с "$". Никаких там мерзких "@", "%", "&" и других символов для переменных разных типов. Они - пережитки Юниксовского shell-а (кто не прочувствовал, посмотрите установочный файл Apache, написанный на csh - он занимает около 100 Кб). Зачем они интерпретатору? Он ведь и так знает, кто есть кто.
          Обработка форм. Пожалуй, в PHP она работает почти идеально. И быстро. И с поддержкой массивов (правда, только одномерных). А также с поддержкой закачки - теперь для организации upload-а не нужно делать вообще ничего - сиди и жди, пока файл не придет, а потом забирай его из временной директории.
          Базы данных. Чтобы обращаться к базам данных, нужно использовать модули, многие из которых имеют просто феноменально большой размер, что, конечно, сказывается на быстродействии. А в PHP поддержка БД встроена. Имеется практически полный набор функций для работы с почти всеми известными человечеству базами данных. На все случаи жизни.
          Если душе хочется универсальности, то очень быстро отказываешься от того, чтобы выводить страницы при помощи скриптов через оператор print. Например, так:

print "Content-type: text/htmlnn";
print "<html><body>n";
print "<h1>Hello!</h1>nHere is the numbers: ";
for(my $i=0; $i<10; $i++) { print $i; }
print "</body></html>";

          Этот вариант, конечно, не лезет ни в какие ворота. А что если нужно сделать редизайн? Лучше сразу повеситься. В то же время, в PHP можно комбинировать обычный html-такст с кодом скрипта. Например:

<html><body>
<h1>Hello!</h1>
Here is the numbers:
<?for(my $i=0; $i<10; $i++) { print $i; }?>
</body></html>

          Я думаю, достаточно перечислять, чем PHP лучше Perl-а. Интереснее будет посмотреть, где он хуже. Итак...
          Удивительная медлительность. Так, пустой цикл в PHP выполняется в 70 раз медленнее, чем в Perl. Регулярные выражения работают в 10 раз медленнее. Строковые операции - примерно в 5 раз медленнее. И как только они умудрились так написать?..
          Вообще никакой поддержки модульности. Правда, ее можно все-таки организовать вручную, и потом работать с "модулями", почти как в Perl. Но получается очень медленно. Основное время выполнения скрипта оказывается затраченным на подключение модулей.
          Немного недоделанный интерпретатор. Так, если функция возвращает массив, мы не можем обратиться к его, скажем, пятому элементу при помощи Func(10,20)[5] - только через промежуточный массив. Но, кстати, это не так уж и обременительно.
          Пожалуй, все. Всего два крупных недостатка, но каких...

здесь ( http://webscript.ru//dklab/modules )):

  • Перенаправление ошибок в браузер - 100% как в PHP
  • 500-я ошибка побеждена. Теперь все работает в точности так же, как в PHP.
  • Обработка форм - можно добиться возможностей, которые PHP и не снились. Причем относительно простыми средствами. Кстати, насчет стандартного CGI.pm - ужасный слон. Я поковырялся в нем, хотел понять, как там устроена обработка закачки. Лучше бы я этого не видел... И потом, вам не кажется, что 130 Кб кода на Perl (размер CGI.pm) - несколько чересчур?..
  • Сериализация реализуется довольно несложно, причем можно даже сделать ее совместимой с PHP-шной. Можно также воспользоваться модулем Storable, который работает очень быстро.
  • Вставки Perl-кода прямо в html-документ. Эта возможность, являющаяся ключевой в PHP, на Perl реализуется несколько сложнее, чем все вышеперечисленные. Но реализуется, причем, опять же, с большими возможностями, чем имеет сам PHP.
          Итак, вывод: Perl по всем параметрам (ну почти) лучше, чем PHP. Он в несколько раз сложнее, это точно. Неоправданно сложнее, вот что обидно. Но привыкнуть, я думаю, можно. Поэтому, как только PHP-шная горячка несколько спала, впереди забрезжил свет. Свет языка Perl.

13 июня 2000, 16:52
Дмитрий Котеров( mailto:dk@dizain.ru )
Лаборатория dk ( http://webscript.ru///www.dizain.ru/dklab ), ©2000