Node.js против Perl

2015-07-26

node.js vs perl

Понадобилось тут написать RSS-запчасть для “Лавки”, Все подобные задачки в моём случае решаются с помощью старого доброго Perl. Собственно, его и хотелось использовать.

Подробней о внутренностях магазинчика здесь. К несчастью, ни плагин, ни сам GetSimple из коробки RSS не умеют, есть некоторое количество заброшенных “приблуд” для GS, но изучать PHP-код нет никакого желания (too old for this shit).

Для упрощения задачи будем генерить по крону статический файл каждый час. Итак, нужно:

  • Вычитать XML-файлы данных и найти те, что соответствуют товарам
  • Также вычитать человекопонимаемые имена категорий
  • Сделать хэш товаров, отсортировать его по дате и вынуть первые шесть штук. Ибо да, человеческий мозг не в силах удержать большее количество объектов в голове, а с развитием социальных сетей - и того меньше. Но будем надеяться на лучшее.
  • Собственно создать XML файл стандартного формата, где будет заголовок, дата, картинка и excerpt. Ну и ссылка правильная.
  • PROFIT

Беда пришла, откуда не ждали. Внезапно…

Perl unicode support вещь мутная, требует глубокого изучения и “как бы намекает”, что поддержка национальных языков была “притянута за уши”.

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

Добила ситуация, когда раскодирование через HTML::Entities переводило символ “неразрывного пробела” в некий спецсимвол UTF-8, который в консоли отображался черти-чем и вызывал общую сумятицу.

Вобщем чем дальше в лес, тем толще партизаны. В голове заиграл подленький вопрос “зачем вообще что-то делать ???”.

Стоп, хватит буллшита. В 2015 году определенно есть скриптовые языки, которые и юникод поддержат, и regexp, да и вообще крови как-то поменьше попьют. И таки да, node.js - серверная или консольная (кому что нравится) реализация JavaScript - пришла на помощь.

  • UTF8 из коробки
  • regexp из коробки, и да! прямо с поддержкой unicode
  • человеческий синтаксис и вообще шик
  • модули npm составляют отличную конкуренцию набору от CPAN
  • работает на всех популярных платформах.

В общем 2 часа работы и скрипт готов, грабли асинхронности тоже благополучно собраны и ликвидированы.

Например:

var myHash1=[]; var myHash2=[]; readFIle(filename,functionXXX) print_hashes functionXXX { fillHash1 fillHash2 }

Boom!

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

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

И такие вещи могут встретиться много где. Авторы трудов по node.js об этом явно предупреждает, но жизнь устроена так, что читать начинаешь после, а не до.

Тем не менее, Perl’у я лично очень благодарен. Благодаря ему удалось вырваться из C++ -прошлого и расширить горизонты. Есть масса задач, которые решать нужно именно на нем. Node.js, правда, еще больше расширяет картину мира и заставляет мыслить немного по-другому.

Итог - скрипт работает, будет протестирован в ближайшее время, результат здесь

P.S. Node.js прекрасно оптимизируется для ARM-процессоров при сборке из исходников.

P.P.S Не нужно умножать сущности без необходимости.


В массы

В трубу