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


Оглавление (нажмите, чтобы открыть):

Блог веселого программиста

Я надеюсь здесь собрать все, что мне кажется интересным. Возможно, это понравится и Вам.

PHP или Perl?

Инструмент нужен под задачу, и сравнение этих двух языков программирования сведется к обычной демагогии.

PHP более легкий, и изначально он заточен для того, чтобы отрисовывать динамически создаваемые веб-странички. Все остальное, что написано на php и запускается из командной строки или по крону, зачастую сделано нерационально.

Perl же изначально задуман для обработки текстовой информации. Сейчас это очень мощный язык программирования, с нормально реализованной многопоточностью. На нем тоже можно писать веб-приложения (и весьма успешно), но при прочих равных условиях на php это сделать проще.

Подход к программированию на этих языках отличается. Если проводить аналогии со строительством, то написание программ на Perl это в основном сборка уже готовых блоков (модулей) с последующей небольшой доработкой; разработка же на PHP – это как правило, разработка с нуля.

Благодаря Comprehensive Perl Archive Network (CPAN) каждый разработчик может пользоваться уже готовыми решениями для многих случаев жизни.

Например, я уже забыл, когда извлекал линки из HTML-страниц с помощью регулярных выражений; для этих целей есть модуль HTML::LinkExtor. Понадобилось вытащить настройки из конфигурационного файла в XML? Раз плюнуть, пользуйтесь XML::Simple. Надо написать поискового бота? Тоже несложно, LWP::RobotUA в помощь.

Зачастую задача программиста на Perl в сводится к тому, чтобы собрать в кучу все необходимые уже готовые модули и подружить их со своим кодом; он экономит кучу времени, пользуясь результатами труда других разработчиков.

Но надо отдать должное php, синтаксис там интуитивно понятный в основной своей массе. Одни только специальные переменные Perl могут вызвать отвращение с первого взгляда на них. Ну разве можно новичку самому догадаться о том, что хранится в переменных $`, $&, $_ или $/ ? Без стакана и чтения документации разобраться сложно. А вот с документацией у Perl все в порядке, команда perldoc позволит быстро найти все, что надо.

PHP или Perl? : 3 комментария

Когда-то тоже прогил на Перле, а сейчас приходится на пэхапе – тоскую

Мне тоже приходится писать и на php, и на Perl. Инструмент нужен под задачу, нет смысла палить из пушки по воробьям. Для простого – php, для навороченного – perl, для быстрого – С.

У меня все проще, перл для меня остался языком для системы, обработки логов, небольших утилит. А на пхп делаются сайты.

Perl&PHP

Здравствуйте.
Из файла Perl мне нужно выполнить некоторые действия другим файлом, файлом PHP (он в этой же папке) и продолжить работу первого файла т.е. Perl.
do, require, use что то не получилось у меня,
refresh выполняет задачу, но это вовсе неправильно, т.к. вместо того, чтобы выполнить все необходимые действия на сервере, начинается пересылка ненужных запросов пользователю и обратно и только потом продолжение выполнение основной программы.
Как можно решить задачу без запросов?

Добавлено через 1 час 38 минут
Не у меня одного такой вопрос — поиск по форумам — в разных вариантах такой вопрос неоднократно поднимался — конкретного ответа нигде не видно -> решения нет?

25.09.2010, 13:11

Perl & JSON
Имеются данные в формате json: $VAR1 = < 'jsonrpc' =>‘2.0’, ‘id’ => 2, .

perl & flash
Всем привет! Есть сайт с флеш страницей, на которой нужно авторизоваться, введя логин и пароль.

Я ненавижу Perl & мне нужно на нём писать
У меня на работе частенько возникают задачи, которые имеет смысл упростить автоматизацией. Так уж.

Передача данных между Perl и PHP
Всем привет! Стоит такая вот задача: Есть файл test.php и test.pl и из одного, скажем из test.php.

Графика в Perl, как создать GIF в Perl.
Помогите создать GIF при помощи перла. И где взять модули?

переход с perl на php

У меня нет опыта работы с Perl, а также я новичок в PHP. Мне нужно перенести старую систему компании, используя Perl, на новую, используя PHP. Вот некоторый код на Perl, который я не понял:

Может кто-нибудь объяснить, что означает код и чем он станет в PHP? Кроме того, что означает $a-> <$b>в Perl?

Я пытался понять это с 3-х дней, но все еще испытываю трудности с этим.

2 ответа

Я не использую php, но я пытаюсь объяснить код в целом:

Вы можете прочитать больше о хэше Perl, например, здесь (я повторяюсь): http://perlmaven.com/perl-hashes

Ну, так как я не php-программист, я просто могу сказать вам, что означает Perl-код. Может быть, это поможет вам немного дальше!

Символ @ указывает на массив в Perl. Таким образом, @oid_list рассматривается как единое целое. Поэтому в него можно push @oid_list, $data-> значение $data-> ( push @oid_list, $data-> ).

Синтаксис $data-> немного сложнее. Представьте, что $data — это ссылка (просто указатель) на Hash (или в других языках, таких как Java, называемых Map). Но вы скорее хотите получить доступ к хешу за этой ссылкой. Таким образом, вы используете -> для разыменования указателя и доступа к реальному хешу, на который указывает $data . С помощью $data-> вы получаете доступ к значению, стоящему за ключевым oid в Hashreferenceby $data .

Похожая вещь происходит в push @<$snmp_order-><$sensor>>, $data->; , Но здесь вы сначала должны получить доступ к реальному массиву за ссылкой $snmp_order-> <$sensor>. Здесь ключ ссылочного хеша содержит ссылку на массив, который получает значение $data->; внутрь.

Остальная часть кода является своего рода этими двумя вещами. Программист просто присваивает разные значения из выбранной строки базы данных $data различным ключам большой хеш-ссылки $oid_hash . В <> вы всегда найдете название ключа, к которому осуществляется доступ.

Perl и CGI программы — особенности использования

1. Использование готовых скриптов

Если у вас уже есть написанные CGI-скрипты, то прежде чем скопировать их на сервер, вы должны сделать следующие действия:

  • Убедиться, что в скриптах указан правильный путь к интерпретатору:

Perl: /usr/bin/perl
Python : /usr/local/bin/python

  • Если вашему скрипту требуется доступ к базе данных MySQL , то необходимо указать параметры доступа (см. статью Подключение к серверу MySQL)
  • В разделе Управление веб-серверомпанели управления хостингом включить модуль CGI.

Теперь вы можете скопировать свои скрипты на сервер.
Загружать файлы необходимо в каталог ваш_домен/cgi. Файлы из данного каталога будут доступны по адресу http://ваш_домен/cgi-bin/имя_файла. Для того чтобы CGI-скрипты запускались из корневого каталога сайта ваш_домен/docs, необходимо создать в нем файл .htaccess со следующим содержимым:

На скрипты необходимо установить права доступа 755 или -rwxr-xr-x.
Права доступа можно изменить с помощью файлового менеджера панели управления.

2. Написание простейшего CGI-скрипта

Рассмотрим написание простого CGI скрипта на Perl.
Если вы работаете под управлением ОС «Windows», то для работы с кодом скриптов вам необходимо использовать специализированный текстовый редактор, например, Notepad++. Стандартную для Windows программу «Блокнот» лучше не использовать. Для демонстрации работы CGI скрипта необходимо создать два файла. Первый файл представляет собой html-документ с формой ввода текста:

HTML PUBLIC «-//W3C//DTD HTML 4.0//EN»>

Пример работы с Perl

Должен ли я использовать Perl или PHP или что-то еще для этого проекта?

Я собираюсь приступить к проекту, который должен будет:

  • Процесс XML
  • Сильный синтаксический анализ документов, отличных от xml.
  • Вставка данных из документов xml и non-xml в реляционную БД.
  • Представить обработанные данные пользователю из db с помощью веб-страниц.
  • Нужно очень хорошо обрабатывать нагрузку.

Веб-сайт будет подвергаться кратковременным очень сильным нагрузкам на страницы (более 300 посетителей в минуту в течение нескольких минут), но большую часть времени будет бездействовать (около десятка посетителей в минуту).

У меня очень сильный фон в Java и веб-сервисах, но я не хочу использовать Java для этого проекта, так как я бы хотел разнообразить свой набор навыков.

Я не ищу вашего мнения, на каком языке вы считаете лучшим. Каковы некоторые плюсы и минусы использования этих языков, которые вы могли бы узнать из своего собственного опыта?


Так как я парень PHP, вот что я могу предложить о PHP

Итак, требования к языку из вашего вопроса удовлетворяются PHP.

Однако, Perl, Python или Ruby или даже ServerSide JavaScript (. ) должны быть способны выполнять то, о чем вы просите. PHP имеет это причуды, так же как и другие языки. Если вы Java Guy, вам может понравиться Ruby для его синтаксиса, но опять же, только вы можете решить.

Я бы пошел с Perl. Серия LibXML предоставляет множество интерфейсов (DOM, XPath, XSLT и т.д.), Поддерживаемых быстрым C-парсером.

Поддержка регулярного выражения Perl для нарезки и текстурирования текста в значительной степени не имеет аналогов на любом другом языке. Если вы ожидаете сделать много произвольной обработки текста и, по крайней мере, немного знакомы с регулярным выражением, вы будете благодарны.

В Perl также есть серия отличных веб-фреймворков, включая простую, но мощную Mojolicious, а также всеобъемлющую Catalyst. Всегда есть древняя и стабильная библиотека CGI, но Mojolicious или Catalyst, вероятно, будут лучшим выбором.

  • Perl хорошо масштабируется
  • Perl поддерживает различные библиотеки XML
  • Perl поддерживает большое количество RDBM через DBI
  • Perl поддерживает кеширование
  • Perl поддерживает веб-службы, такие как SOAP, XML-RPC и т.д.
  • Perl имеет множество механизмов шаблонов

Поэтому каждый отдельный элемент в вашем списке может быть выполнен с использованием обоих языков. Вы должны выбрать тот, который, по вашему мнению, сделает вас наиболее продуктивным с учетом ваших сильных и слабых сторон.

Это, действительно, очень субъективный вопрос. Я могу полностью понять, что в 2010 году Perl или PHP (и даже Python или Ruby) могли бы одинаково служить вам для такого проекта. Разница не будет исходить от самого языка, а также инструментов, лучших практик и сообщества.

Среди этих языков я больше всего знаком с Perl, поэтому позвольте мне попытаться предложить ответ с этой точки зрения в отношении ваших потребностей.

Анализ текста и XML: Perl имеет очень надежную поддержку для синтаксического анализа текста даже очень длинных файлов (если вы don ‘t slurp) и позволяет мощное, ясное и легкое регулярное программирование. Он имеет ясную встроенную поддержку Unicode и стандартные средства транскодирования (Encode), что очень удобно, когда речь идет о пользовательских интерфейсах. Он также имеет прямую привязку для libxml2 в виде стандартного, быстрого и ухоженного модуля: XML::LibXML.

Поддержка реляционных БД: В дополнение к стандартному интерфейсу базы данных (DBI), который позволяет напрямую SQL запросов к нескольким СУБД, существует ряд фреймворков, которые упрощают управление DB-to-Webdoc, но все еще мощные. Самый известный, вероятно, Catalyst.

Представление HTML-документа: Mason — мой любимый механизм доставки веб-приложений. Интеграция с Perl настолько элегантна, но не жертвует шаблонами шаблонов или языковыми особенностями.

Обработка тяжелой нагрузки: Существует так много решений, что есть проблемы с загрузкой. Perl предлагает привязки для memcached: Cache::Memcached (написано на Perl) и Cache::Memcached::Fast (написано на C).

Мастер Йода рекомендует:  Создаем блестящий щит

Баланс с вашими личными предпочтениями в отношении синтаксиса и общей философии языка, и вы могли бы очень скоро присоединиться к сообществу Enlightened Perl: )

Как представляется, основная часть вашей работы будет обрабатывать данные больше, чем презентация, на мой взгляд, это то, что Perl делает лучше всего. Perl отлично справляется с регулярными выражениями, а широкий набор модулей на CPAN может помочь вам разобрать обычные форматы. В Perl также есть несколько рамок, которые облегчат жизнь при представлении данных. Основным недостатком для новичков является десятка распределений по CPAN для каждой из различных проблем, с которыми вы можете столкнуться (синтаксический анализ XML, веб-инфраструктура, ORM и т.д.), Может быть трудно принять решение о том, какой из них использовать. Благодаря Plack/PSGI, общение с веб-серверами с Perl в последнее время стало намного лучше.

Важно, что «загрузка» — это проблема, которая является полностью языковой агностикой, поэтому это не тот язык, который вы выберете, так как вы разрабатываете свою систему, которая будет определять, насколько хорошо она обрабатывает повышенную нагрузку. Perl, Java, PHP все были использованы в небольших настройках вплоть до некоторых из наиболее загруженных сайтов в сети. Если рост зависит от ваших будущих потребностей, отделите, где это необходимо, и спроектируйте для будущего расширения в первую очередь. Несколько серверов баз данных, кэширование, очереди сообщений и работы могут использоваться в малом масштабе, а их включение, когда что-то мало, проще, чем переписывать или быстро взламывать их, когда требуется больше ресурсов.

Ваша архитектура и алгоритмы будут иметь большее влияние на скорость и масштабируемость, чем выбор языка.

Perl, PHP или Java будут выполнять эту работу.

Я бы сделал это в Perl, так как я это хорошо знаю и предпочитаю PHP (что также хорошо знаю). Ваш пробег будет варьироваться.

Почему бы вам не попробовать Ruby on Rails?

Возвращаясь к вашему вопросу, я бы сказал, PHP. Поскольку вам нужно научиться чему-то новому, и в то же время у вас должно быть отличное сообщество, где вы можете найти поддержку.

PHP выполняет все, что вы запросили.

Я бы использовал Common Lisp.

  • Закрытие XML для синтаксического разбора XML
  • cl-ppcre является perl-совместимой библиотекой регулярных выражений, но в зависимости от того, какой текст вы хотите проанализировать, вы, возможно, найти специализированные парсеры в Common Lisp Directory.
  • Я не знаю, какую базу данных вы хотите использовать, но Postmodern очень приятен для Postgres. Существует также более общий CLSQL.
  • Вы можете использовать Hunchentoot в качестве веб-сервера и, например, CL-WHO для создания HTML-страниц. 5 страниц в секунду не должно быть проблемой.

Насколько мне известно, регулярное выражение PHP (которое я бы предположил, это то, что вы будете использовать) библиотека PCRE появилась в Perl, Поэтому, если у вас много парсинга, отличного от XML, вам нужно протестировать оба и посмотреть, какой из них работает быстрее. Я не уверен, какой из них быстрее для вас.

Оба они хорошо обрабатывают XML (наконец).

Однако PHP — это просто массовое сообщество. На планете нет других языков сценариев, больших. Так что если это имеет значение для вас, то используйте PHP, поскольку вы можете найти все под солнцем.

Однако у Perl также есть большое число, и я уверен, что есть много учебников для всего, что вы хотели бы сделать.

Python — это также язык, который вы, возможно, захотите изучить. Черт возьми, поскольку все поняли, что Рубин был Божьим подарком миру, в который он тоже взорвался! Вы можете делать то, что хотите, на любом языке, поэтому вам нужно взглянуть на синтаксис каждого из них и выяснить, какой из них вам больше всего нравится. Оттуда вы можете запустить простой примерный тест в каждом из них, чтобы узнать, какой язык является самым быстрым для вас.

Что бы вы ни делали — не используют «фреймворк», например wordpress или drupal . Они CMS не являются каркасами и настолько медленны и раздуты. WordPress занимает 8 МБ, чтобы загрузить индексную страницу!

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

Веб-разработка

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

Perl имеет некоторые особенности, которые придают ему индивидуальность. Однако, новички часто не замечают этих особенностей. Кроме того, язык Perl более низкоуровневый и гибкий, чем тот же php. Поэтому возникают некоторые проблемы, связанные с понижением уровня при переходе от php к Perl. Какие же ошибки совершают начинающие Perl-хакеры? Одинаковые. Все наступают на одни и те же грабли. Чтобы этих граблей было меньше, я описал и их, и противограблиные методы кодирования. Вот что у меня получилось.

1. Указание неверного местоположения Perl

Просто запомните раз и на всегда: Первой строкой в программе на Perl всегда должна быть строка с директивой, указывающей на интерпретатор Perl. Чаще всего эта строка выглядит так:

До этой строки не должно идти ничего. Когда я говорю «ничего», я имею ввиду НИЧЕГО, даже пробельные символы и переводы строк.

2. Пропуск «;» в конце строки

В Perl оператор точки с запятой не является опциональным, в отличие от, скажем JavaScript. Поэтому символ «;» нужно ставить в конце строки всегда. Исключением может быть последняя строка в блоке:

В случае, если в блоке выполняется единственное действие, точка с запятой даже нежелательна, потому что затрудняет визуальное восприятие кода.

3. Блоки, не заключенные в «<>»

В Perl обязательно нужно заключать блоки в фигурные скобки. Даже если блок состоит из одной строки:

for($i = 1..10) print $i #НЕВЕРНО!
for($i = 1..10) #Теперь OK

Исключение могут составлять поствиксные операторы. Например:

print $i for ($i = 1..10);

Иногда такая форма записи улучшает читаемость, иногда – нет. Следите за смыслом!

Следующие ошибки связаны с вводом-выводом.


4. Отсутствие заголовков при CGI-программировании

Если вы разрабатываете сайт или веб-приложение, вам понадобится выводить информацию, сгенерированную скриптом в браузер. Чтобы браузер понял что вы такое ему передаете, ему нужно передать верный заголовок с этой информацией. Часто бывает достаточно такого:

print qq(Content-type: text/html\n\n);

Обратите внимание, что этот заголовок должен выводиться ДО контента. Так же, обратите внимание на два спец-символа \n. Поясним, зачем они нужны. Вообще-то, после заголовка должен идти один символ перевода строки. Однако, заголовки должны отделяться от контента пустой строкой или «пустым заголовком». Этот пустой заголовок и описывается одиночным «\n».

То есть, если вы хотите передать не один заголовок, то вы должны указывать один перенос строки в конце каждого заголовка, не являющегося последним, и два – в последнем заголовке:

print qq(Cache-control: no-cahce\n);
print qq(Content-type: text/html; charset=utf-8\n\n);

Здесь мы указываем, что передаваемую страницу не надо кешировать, что передаем мы html-страницу в кодировке utf-8.

5. Запятая после указания дескриптора файла при print

Часто встречается ошибка:

print F, $text; #НЕВЕРНО

Со стороны кажется, что все правильно и в файл с дескриптором F должно записаться содержимое $text. На самом деле, этого не произойдет. Виновата запятая после «F». Эта запись должна выглядеть так:

print F $text; #OK

6. Попытка вывода при чтении

Продолжая тему print и дескриптора файла, можно еще выделить один тип ошибок:

Эта запись не верна. Дело в том, что оператор угловых скобок « » ЧИТАЕТ из файла с дескриптором DESC одну строку (в скалярном контексте). Для вывода в файл, угловые скобки нужно опустить.

#Для чтения из файла строки, нужно написать следующее:
$line = ;

#Для чтения всего файла в массив:
while ( )

#Для чтения файла в большой скаляр:
while ( )

#Для записи строки в файл:
print F $text;

7. Ожидание сообщений об ошибках в браузере

Те, кто пришли в Perl из более младших языков, удивятся, почему ошибочный скрипт не выполнится, но не выведет ни единой ошибки в браузер? Просто Perl не проектировался для web. Поэтому все ошибки он отдает серверу, который пишет их в лог ошибок. Вы можете найти сообщения об ошибках в логе сервера. Однако, это не удобно. Гораздо удобнее получать сообщения об ошибках в браузере. Для этого достаточно включить в скрипт строку:

use CGI::Carp qw(fatalsToBrowser);

Теперь все ошибки, возникающие в скрипте, будут перехвачены и выведены в браузер.

Следующие ошибки будут связаны с особенностями синтаксиса Perl.

8. Обращение к массиву, когда подразумевается обращение к скаляру

В Perl переменные снабжаются префиксами, указывающими на их тип. $ — скаляр, @ — массив, % — хеш-массив. Если присмотреться к этим символам, то можно заметить стилизованные буквы «S» и «A» из слов «scalar» и «array», а так же интересное графическое представление ключа и значения в «%». Часто начинающие программисты допускают ошибку, указывая неверный префикс. Например:

@array[$i] #Ошибка!
$array[$i] #OK
%hash #Неверно!
$hash #Теперь нормально.

Если элементом массива является ссылка на другой массив, то нужно добавить еще один префикс, соответствующий типу ссылки. Например, вот столбец из двумерного массива:

@$array[$i] #Получаем i-й элемент @array, который является ссылкой на массив

9. Неверная установка контекста

В Perl многие функции и операторы ведут себя по-разному, в зависимости от контекста, в котором они находятся. Понимание этого механизма приходит с опытом. Однако, вот ошибки, которые встречаются особенно часто.

My $x, $y = (‘var1’, ‘var2’); #Ошибка. My – списковый оператор.
My ($x, $y) = (‘var1’, ‘var2’); #Теперь OK

$x = (1, 2, 3); #Здесь $x == 3
($x) = (1, 2, 3); #А здесь $x == 1
@a = (1, 2, 3, 8);
$x = @a; #$x становится равным 4 – длина массива @a.

10. Неверное написание elsif

Люди, пришедшие из других языков программирования должны смириться с тем, что в Perl оператор повторной проверки на условие пишется elsif.

Эта конструкция ошибочна, потому что else должен открывать блок. В то же время, следующая запись будет верна.

Вам нужно следующее:

Обратите внимание, что в отличие от php, последнюю букву в слове else оператора elsif дописывать не надо. Elsif, а не elseif.

11. Неявное переопределение переменных по-умолчанию

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

Например, если мы удаляем все пробелы во всех элементах массива и выводим эти элементы, это может выглядеть так:

Этот код рабочий. Мы присваиваем $_ очередное значение из @text, затем удаляем в нем пробелы, а затем выводим. Спросите, где здесь может быть ошибка? Внесем некоторые изменения. Допустим, наш массив содержит ссылки на масивы. Тогда мы напишем:

От куда же здесь взялась ошибка? Дело в том, что вложенный цикл foreach неявно задает значение переменной-местоимению $_. Сначала происходит обращение к массиву @$_, первое значение из этого массива присваивается переменной $_! Далее, с ней производятся какие-то действия, но это уже не важно. Мы переопределили ту переменную, которая указывала на массив. Решение проблемы лежит на поверхности: запоминайте значения переменных по-умолчанию, когда это нужно.

foreach (@text) <
my $tmp = $_;
foreach (@$tmp) #Теперь ОК
<
s/\s//g;
print;
>
>

12. Использование « , ==, != и » со строками

Perl обладает парами операторов логического сравнения. Для строк и для чисел. Вы должны четко представлять какой оператор вам нужен в данный момент. Чтобы понять разницу, рассмотрим пример:

«123» == «123.00» #Истинно
«123» eq «123.00» #Ложно

Кроме того, иногда программисты небрежно обращаются с истиной в Perl. Ошибочным может быть такой код:

Казалось бы, ну что тут ошибочного? Синтаксически – ничего. Perl не станет ругаться на эту строку. Однако, программист сам мог подложить себе свинью. Дело в том, что если в $f окажется значение «0», то этот ноль не будет выведен, хотя могло подразумеваться иное. Если вы хотите выводить все непустые значения $f, включая ноль, то вам нужно написать:

13. Использование «||» и «&&» вместо «or» и «and» соответственно

Нужно помнить, что операторы or и and имеют очень низкий приоритет. Иногда, это как раз то, что требуется, но иногда результат, который вы получите будет отличаться от результата, который ожидался. Например, давайте присвоим первое из истинных значений переменной.

Мастер Йода рекомендует:  Псевдоклассы СSS not() и target

$xyz = $x || $y || $z; #$xyz примет первое истинное значение

Но если мы используем or, результат будет другим:

$xyz = $x or $y or $z; #$xyz примет $x, затем будут выполнены or.

Будьте бдительны!

Ну вот и все. Вся чертова дюжина в сборе. Это, конечно, не все ошибки, которые возможны. Однако, эти грабли часто встречаются на пути начинающего Perl-кодера. Этой статьей я хотел предостеречь или помочь новичкам в нелегком, но интересном деле освоения Perl.


А какие ошибки знаете вы?

При подготовке материала использовалась книга Ларри Уолла, Тома Кристиансена и Джона Орванта «Программирование на Perl» («Programming Perl»), O’Reily, 2006

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

Я раньше видела обсуждения в духе «PHP против Python», а сейчас заинтересовалась темой РHP vs Perl применительно в веб-разработке.

Думала, Перл устарел, но в табличке TOIBE за сентябрь он сразу под Go, на 17-м месте. Значит, кто-то на нем пишет. Стало любопытно, что за новый Perl 6. На первый взгляд выглядит он неплохо. Старый язык пытаются привести в чувство, даже грант дают тому, кто предложит что-нибудь дельное для его развития.

С JavaScript у меня нормально, а вот с PHP не заладилось. Ищу ему замену. На работу мне не наниматься (я на пенсии), поэтому требования работодателей не важны, а для своих нужд могу пользоваться чем угодно )))

Начала выяснять отличия PHP и Perl, узнала, что «верблюд» более самостоятелен 🙂 То есть с Перлом везде код работает одинаково и веб-приложение не зависит от того, какие функции поддерживает хостинг.

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

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

. для начинающего Web-программиста.
Никак не выберу для себя, какой из них лучше.

Значит php лучше :))

Будущее за python
Запомните эти мои слова 🙂


> Kerk © (23.01.06 20:31) [5]
>
> Будущее за python
> Запомните эти мои слова 🙂

Че за зверь такой? 🙂

«Иногда содержимое Perl-программ выглядит для непосвященных как случайный набор символов, но, естественно, он имеет контрольную сумму, а каждый его символ — свое назначение.» (c)

Как это вообще может работать?

>А что лучше Perl или PHP
. для начинающего Web-программиста.

HTML + JavaScript.
Дальше в зависимости от личных предпочтений и производственной необходимости: PHP, Perl, Python, ASP.NET etc.

> [9] Lamer@fools.ua © (23.01.06 23:18)

Полностью поддерживаю [9].

А что бы ни было — PHP, Perl, Python, ASP.NET etc.
Все равно, мимо того, что приходит клиенту(HTML + JavaScript(VBScript)), не проскочишь

s/ ]|\n)*>//g;
> .
> —————————
>
> Как это вообще может работать?

Так это регулярка написана. Тут язык то и не причем, имхо.

PHP.
1. Проще для восприятия
2. Более распространен сейчас. Хотя Perl еще востребован.

я бы посоветовал Perl. Он не сложнее PHP, но более универсален. Хотя, кончно, сейчас PHP есть практически у любого хостера, а Perl встречается реже.
для cgi на перл должен быть сервер Апач с perl_mod. На IIS можно поставить Activestate PerlScript.

s/ ]|\n)*>//g;
> .
> —————————
>
> Как это вообще может работать?

практически точно также как и в PHP 🙂 см. preg_replace
неудачный пример просто привел. у меня под рукой нет, но есть действительно конструкции — супер.


> я бы посоветовал Perl. Он не сложнее PHP, но более универсален.

он действительно сложнее PHP. и универсальность его — вопрос спорный.

Язык может считаться законченным только тогда, когда в его синтаксисе задействованы все символы на клавиатуре.
(с) Ларри Уолл

Для Web (тем более для начинающего в Web) считаю PHP лучше.

( Но Perl — классная вещь ! 🙂

> McSimm © (24.01.06 10:59) [15]

А Паскаль язык какой?
Вот есть на клавиатуре

По сути, знающий Perl, поймет PHP по нисходящей.
Хотя «знать» их по-моему, несколько отличное от того, что знать — Паскаль.
Но не Дельфи с компонентами. По суи там ведь знание небазовых возможностей, а библиотек и дает силу.


> Думкин © (24.01.06 11:06) [16]

Что значит какой? В каком смысле?
Приходит на ум — очень правильный. Сколько языков испробовал — Паскаль любимый (хоть и не приходится пользоваться уже давно)

Знание Perl на мой взгляд никак не отразится на понимании PHP. Ничего кроме практики и внимательности к документации для понимания PHP не надо.
Умение писать Web-приложения на «чистом» Perl имеет полезное следствие — будешь знать подробности о HTTP протоколе.
Perl хорош (для меня) тем, что доставляет эстетическое удовольствие от крачивых решений.

Проблема незнания тонкостей, «компонентокидания», присуща всем трем.
Но при серьезной работе все три накажут за это.

> McSimm © (24.01.06 11:18) [17]

В свете фразы:

> Язык может считаться законченным только тогда, когда в его синтаксисе задействованы все символы на клавиатуре.
> (с) Ларри Уолл

Я тоже по поводу Паскаля. разделяю твое мнение. Красивейший язык. И лично для меня — самый удобный. если есть задача — то на нем я ее отдаю, обычно быстрее, чем при использовании другого. Если кодирую.

Про PHP — так и есть. Во-всяком случае, несколько вещей, которые я там сделал — ничего более и не требовали. Чтение, чтение и еще раз чтение — внимательное. Но мне он не понравился. Хотя для создания сайта под Юникс — выберу его. Но это пока не вполне моя тема. Чайник.


> В свете фразы:

Ларри Уолл — автор Perl. И сказанное им было шуткой, я счел ее уместной в данной теме 🙂

> McSimm © (24.01.06 11:38) [19]

Ну я и спросил. 🙂 Уместно, конечно.

In fact, a big part of learning Perl is actually learning how Larry thinks.[24] Therefore, once you can think like Larry does, you know what Perl should do. But while you»re learning, you»ll probably need to look into the documentation.

[24] This is only fair, since while writing Perl he tried to think like you do to predict what you would want!

Выбирай ПХП, однозначно.
В свое время я тут задавал вопрос что учить дял вебпрограммирования
ПХП или АСП? Мне порекомендавали ПХП. Очень рад что выбрал правильное направление.

Для сравнения ПХП и Перл следует провести такой анализ
1 — динамика развития языка(регулярность выхода новых версий, добавление новых функциональных возможностей, поддержка современных технологий и т.д.)
2 — наличие и гибкость функций/модулей для работы с современными СУБД
3 — наличие хороших средств разработки/отладки
4 — распространенность / востребованность специалистов
4 — прочие удобства

Кто осмелится сравнить по такой схеме?

. чтобы не быть голословным

> DSKalugin © (24.01.06 13:15) [23]

а про ASP ведь ты тут вопрос задавал, а не про Perl. А тут сравнить?

Я перл вообще в расчет не брал, когда для себя этот вопрос решал.
Он менее востребован, хотя и универсальней. А ПХП создан именно для веба

Все что угодно, но только не Perl.
Более неподходящего языка для будущей поддержки еще нужно поискать.
Perl можно использовать только для одноразовых утилиток, потому что уже через месяц ты будешь гадать, что это такое и твой ли это код. Дело даже не в комментариях, а в извращенном синтаксисе. Очень много контекстных зависимостей, неявных преобразований и жутких сочетаний символов с неким тайным смыслом. Можно подумать, что при написании сколько-нибудь значиетельного объема есть необходимость бороться за каждый символ исходного кода. Самое смешное, что исходный код все равно компилирется целиком перед исполнением и потому совершенно нет никакого смысла в этой экономии.
Если код написан каким-то любителем perl и размер приличный — почти 100% труба дело.

> Alex Konshin © (24.01.06 13:30) [26]

Так и PHP также.
В ноябре закончил издеваться над одним проектом. Так не покидала мысль, что используй я, ну Дельфи, для той же задачи — то сделал бы намного быстрее — раза в 2 минимум. Борьба была не сколько с задачей, сколько с кодом.

> не покидала мысль, что используй я, ну Дельфи, для той же
> задачи — то сделал бы намного быстрее — раза в 2 минимум.

Так, вероятно, опыта работы с Delphi тоже поболее будет?

> Gero © (24.01.06 13:45) [28]

Безусловно. Но сейчас вот Х++ издеваю — такого напряжения не испытываю.


> Думкин © (24.01.06 13:42) [27]
> Так и PHP также.
> В ноябре закончил издеваться над одним проектом. Так не
> покидала мысль, что используй я, ну Дельфи, для той же задачи
> — то сделал бы намного быстрее — раза в 2 минимум. Борьба
> была не сколько с задачей, сколько с кодом.

Разобратся в чужом коде, порой сложнее, чем реализовать самому. А вообще если использовать Zend Studio в качестве среды отладки — то разобраться будет куда проще. Вещь хорошая, но тормознутая черезчур 🙁


> DSKalugin © (24.01.06 13:27) [25]
> Я перл вообще в расчет не брал, когда для себя этот вопрос
> решал.
> Он менее востребован, хотя и универсальней. А ПХП создан
> именно для веба

Писал на php многопоточный демон для чата (под Win, с самописным модулем на Delphi). По сути простой веб-сервер. Даже не знаю что может быть еще универсальнее.

PHP действительно был создан (исторически) именно для WEB и в большинстве случаев для этого применяется (с блеском — очень много полезного), но разумеется этим его применение не ограничивается — возможности весьма широкие.
Perl — если на то пошло тоже просто язык генерирования отчетов 🙂

2 McSimm © (24.01.06 15:05) [31]


> Perl — если на то пошло тоже просто язык генерирования отчетов
>

когда появился впервые — да. а теперь — вовсе нет


2 vidiv © (24.01.06 14:55) [30]


> Даже не знаю что может быть еще универсальнее.


> когда появился впервые — да. а теперь — вовсе нет

я именно это и имел в виду.

такая универсальность тут и даром не нужна!
Си — вообще самый универсальный, но это не значит, что все всё побросали и начали писать сайты только на Си.

Речь идет о Web-программировании. Соответственно и рассматривать языки надо с точки зрения удобства их применения в этом направлении

Напримепр, в ПХП есть готовые массивы $_POST[], $_GET[], которые содержат передаваемые параметры, например
/forum.pl? >
$ ]; //=1138036328
$n=$_GET[«n»]; //=3
$from=$_GET[«from»]; //=29

то в Перле, насколько мне известно, эти параметры надо парсить вручную

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

поверьте — спор «что лучше» бесперспективен изначально.
Все можно сделать «и там и там».

с чем согласен — тексты Perl более тяжелы для восприятия. Даже собственные.


> Напримепр, в ПХП есть готовые массивы $_POST[], $_GET[],
> которые содержат передаваемые параметры, например
> /forum.pl? >>
> $ ]; //=1138036328
> $n=$_GET[«n»]; //=3
> $from=$_GET[«from»]; //=29

Правильнее будет так:
$ ])):false;

Считаю, что эти самые magic_quotes — лишняя головная боль 🙁


> в Перле, насколько мне известно, эти параметры надо парсить
> вручную

в перле — это однажды написанная функция из нескольких строчек, которую можно применять где угодно. Кроме того, я уверен, что есть уже и готовый модуль для этого.

А есть ли какая-нибудь IDE для работы с PHP, или единственная IDE это блокнот?

Мне перл очень не нравится, но я на нем пишу.

Можете ли вы включить PHP в файл Perl?

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

Мастер Йода рекомендует:  Руководство по командной разработке с Git

Я знаю, что есть способы читать текстовые файлы в Perl, но могу ли я включить PHP-файл в файл Perl?

Perl-интерпретатор может выполнять команды синтаксиса Perl, несмотря на некоторые сходства между синтаксисом Perl и PHP, для запуска PHP-кода вам понадобится PHP-интерпретатор. Вместо этого вы можете использовать некоторые команды Perl для использования вывода скрипта PHP. вы должны выполнить PHP-скрипт, используя интерпретатор PHP в вашем коде Perl, а затем использовать вывод этого выполнения. ваш PHP-код должен быть некоторым кодом командной строки, который возвращает (например, эхо или печать) вывод. если вам нужно передать аргументы в PHP-код, используйте аргументы командной строки при выполнении PHP-скрипта в вашем коде Perl. поэтому ваш код Perl будет выглядеть так:

и ваш PHP-скрипт может получать такие параметры:

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

Вы можете проверить этот проект:

HP :: Include строит на плечах Filter :: Simple и Parse :: RecDescent, чтобы предоставить Perl-утилиту для включения очень простых файлов PHP из Perl-программы.

При работе с Perl и PHP часто бывает удобно обмениваться данными конфигурации между программами, написанными на обоих языках. Одним из решений этого будет использование независимого от языка файла конфигурации (я слышал, что кто-то сказал XML?). Другое решение – использовать гибкость Perl для чтения PHP и переписать его как Perl. PHP :: Include делает последнее с помощью Filter :: Simple и Parse :: RecDescent, чтобы переписать очень простой PHP как Perl.

Фильтр :: Simple используется для включения макросов (на данный момент только один), которые заставляют PHP быть интерполированным в ваш исходный код Perl, который затем анализируется с использованием грамматики Parse :: RecDescent для создания соответствующего Perl.

PHP :: Include был разработан, чтобы позволить более предприимчивым добавлять грамматики, которые расширяют сложность PHP, которые могут быть включены.

php и perl, part 1

отрицательного отношения к perl`у никогда не испытывал. как бы первый php был создан именно на нём, что уже говорит кое о чём. но само изучение постоянно откладывалось «на потом». в своё оправдание могу сказать словами из анекдота * : «не учил потому, что он мне был на фиг не нужен».

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

теперь главное: статья не тема святой войны между “паладинами perl” и “быдлокодерами php”. после пристального ознакомления смею заверить: быдлокод скорее возможен на perl; php более строг и при умелом обращении программирование на нём сводится к сплошному удовольствию.

для начала хочу заметить, что переход с си-подобного языка на perl сопряжён с некоторого рода трудностями (зная c или javascript гораздо проще будет освоить php).

самая главная проблема при программировании на perl для web это ошибка 500. подавляющее большинство, попробовав написать первую программу замечают, что она же является и последней. попытка что-то спросить (особенно если упомянуть, что до этого программировал на php) приводит к пачке насмешек, что тоже не способствует популяризации языка. подход php более удобен: ошибка выводится в браузер, но это, в свою очередь, начинающих очень нервирует. и когда новички узнают про оператор @, писку ихнему нет предела; ошибка забарывается, не успев начавшись. плохо ли это? очень! но, как и в html, можно писать логически неверные вещи — интерпретатор всё благополучно «скушает» и выдаст именно тот результат, который требуется. perl`у этого для быстрого вхождения не хватает.

едем дальше. простой perl-код:

приводит к неожиданной ошибке. правильно так:

. да-да, не забываем фигурные скобочки. javascript и php понимают оба варианта.

«пустяк», скажут перловчане? вот ещё код:

. круто? ещё бы! а работает? однозназно да! только не так, как требуется. чтобы побороть подставу и заставить заработать условие как нужно, потребуется маленькая правка:

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

ещё одна подстава, и снова связана с условием:

пишем, радуемся, запускаем и получаем ошибку 500. почему так? а потому, что в псевдо-си-подобном perl нет операнда elseif. код требуется изменить:

ума не приложу, зачем вместо elseif понадобилось использовать elsif. но так есть.

* Приезжает новый помощник шерифа в городок на Диком Западе. Шериф ему показывает город, знакомит с местными жителями.
Вдруг на полном скаку на главную улицу вылетает всадник — лицо закрыто маской, шляпа надвинута на глаза — и скрывается за поворотом.
— А это кто?
— Не обращай внимания, это неуловимый Джо.
— А почему неуловимый?
— Да нахрен он кому нужен!

Автор публикации

x64 (aka andi)

Похожие записи

Лучшие способы потерять деньги

Задачка про крыску и верёвку вокруг Земли

18 октября 2020

Сквозь пальцы: почему деньги уходят и как сохранять их

11 комментариев

По многим вопросам не согласен. Перечислю.
1) Ошибка 500 — не проблема, если хочется в браузер выводить — за два чиха можно это сделать. Можно заюзать фреймворк типа Catalyst, он это автоматом делает.
2) В чем более строг ПХП? В том, что для сортировки массивов есть сдесяток функций?) Это только лишний геморрой создает.
3) if ($a == 1) print ‘yes’; — то что тут нужны фигурные скобочки, опять же, скорее о строгости языка говорит. но в перле обычно пишут не так, а так —
print «yes» if $a == 1; и не нужны никакие скобочки.
4) == и eq, два оператора, так и должно быть, тк не всегда очевидно что ты сравниваешь. А уж после rsort, asort я бы вообще молчал.
5) elsif на один символ короче

1) а как Вы думаете, почему php попёр в гору, а perl остался уделом избранных? уж не из-за того ли, что php, встретив ошибку, выводил её в браузер пользователю, а перл «ласково» ругался 500 ошибкой и посылал смотреть логи? php более дружественен к людям, пишущем на нём. в перле есть хорошие методы борьбы с 500 ошибкой, но почему они не доступны сразу и из коробки?

2) функции сортировки геморроя не создают. если человек, пишущий на php, не знает какую либо функцию, он просто вобъёт её в поиск и мгновенно получит ответ. а вот поиск по ограничителям регулярок в перловских манах не особо удобен;

3) слова «в перле обычно пишут не так» следует понимать как «я пишу не так». и обратная запись сравнения не всегда удачно вписывается программистами в код. порой с первого раза даже непонятно, что, собственно, код делает;

4) если человек не знает, что сравнивает, это уже явно не косяк языка, а недостаточная проработка архитектуры программы. и нескольких сравнений уж точно можно избежать. сомневаетесь? javascript в помощь. и чем же asort/rsort не устраивают? как я уже говорил, это функции, и достаточно один раз прочитать их описания, после чего всё встанет на свои места:
— sort — сортировка по значениям, после работы хеш превращается в список;
— rsort — аналогично предыдущему, только сортировка в обратную сторону;
— asort — сортировка по значениям с сохранением ключей;
— arsort — аналогично предыдущему, но значения располагаются в обратном порядке.

5) когда в оправдание сказать нечего, уже стало за правило символами мериться. если делали синтаксис си-подобный, глупо было не использовать что-то более привычное.

вообще, холиваров на подобные темы много: php vs perl, mysql vs postgresql, и ещё пачка. так получается, что одни вещи являются инструментами для жжёных старообрядцев, а вторые пусть и не такие мощные, зато более удобные и дружественные.

Еще раз здравствуйте!
Ну что же Вы, сразу так с агрессией? Я просто решил поделиться своим мнением, а Вы перешли на тему «у кого писька длиннее?».
Я вообще-то говорил именно насчет того, что написано в статье, а не о том, какой язык лучше. Очевидно, что каждый инструмент хорош тогда, когда владеешь им в совершенстве. То, что «PHP попер в гору», я думаю, результат более низкого порога вхождения в язык, т.е. с него попроще начать. И не думаю, что это особо связано с 500ой ошибкой, Перл не только в веб используется. Может моя инфа неактуальна, но когда я чуть-чуть юзал ПХП, то в нем были две огромные проблемы — с Юникодом и с многопоточностью. Не знаю, может уже в новой версии сделали это нормально.
Что касается sort. Представьте, что пишите приложение, например, расчета вероятности события в зависимости от закона распределения вероятности. Вы будете писать одну функцию chance и передавать ей в параметрах все, что нужно? Или наплодите normal_chance, pareto_chance, bernulli_chance и тд? Вы, уверен, сами знаете, что второй вариант убог, однако именно так сделано с сортировкой в ПХП. А это засоряет пространство имен и увеличивает объем исходного кода многократно. Кроме того, начинающий программист видит, как это сделано и начинает повторять.
Теперь насчет elsif, думал что Вы поняли, что я просто пошутил насчет того, что на 1 символ короче. На самом деле особого значения не имеет как писать, привыкаешь быстро.

а здравствуйте. да что Вы, какая агрессия? просто думал, что прибежал кразноглазый фанат перла, который до смертного одра будет считать, что чистый код может быть только на перле, а всё остальное (особенно пхп) — быдлокод. прошу прощения, если показался слишком резким.

я не говорю, что исключительно из-за 500-ой ошибки. просто представьте, что человек, далёкий от консолей (виндузятник матёрый) установил себе апач, и к нему прикрутил перл и пхп. написал по простейшему скрипту: print ‘Hello,’ World!’; (да, с ошибкой) и попытался их выполнить в браузере. в результате пых ругнётся на ошибку разбора, перл кинет ошибку 500. человек слыхом не слыхивал ни про какие логи (виндузянник же), и лезет на перл-форум спросить, почему же скрипт выдаёт такое безобразие. и что ему ответят «самые добрые и терпимые» программисты на перле? явно ничего хорошего. и в пользу чего он сделает свой выбор, ответ очевиден. правда, есть одно но: изучение продолжит, только если это действительно необходимо (допусте, хочется под себя заточить какой-то скрипт).
и да, я знаю, что перл это не веб. но статья про веб всё-таки. поэтому ту часть людей, которая пользуются perl для автоматизации рутины на компах, очень хорошо понимаю. пхп для этого слабо подходит.
про проблемы с юникодами слышал, но только в отношении опять-таки перла. с появлением в php библиотек iconv и mb_, а также модификатор регулярок u проблемы закончились (было это ещё в версии 4, так давно, что про utf-8 тогда мало кто слышал, а яндексы ещё крутились на windows-1251).

да, куча функций, конечно, больная тема. и разработчики уже, думаю, порядком себе локти покусали. тем более, что простанство имён появилось только в версии 5.3, так что людям приходилось довольствоваться «затычками». но! для конечного пользователя, в принципе, всё равно: запомнить одну функцию с кучей параметров или несколько простых процедур, каждая из которых выполняет свою сортировку. я это не поддерживаю, с одной стороны, но с другой как сделали, так и стало (а кому надо, уже привыкли). ну и по поводу начинающих программистов тоже неоднозначно. скорее, постоянный 10-кратный if зло не меньшее, чем десяток функций, выполняющих, по сути, одно и тоже.

ну и про elsif. дело тут даже не в том, что быстро привыкаешь. когда мне потребовался перл, в недоумение повергла ошибка в месте else if/elseif: ни одно из этого не подходило. пришлось зарыться в маны, и только там нашёлся ответ. аналогично было, когда мне потребовался перебор, и отказались работать break/continue. да, здорово, когда новый язык похож на что-то уже знакомое. но когда он оказывается «похож, но некоторые операторы названы по другому», это уже злит, не говоря о том, что мешает работе.

Добавить комментарий