Архив метки: perl

Сравнение производительности сетевых библиотек в Perl

Когда задумал сделать парсер тИЦ для LJ Add/Remove Fiends — решил для начала проверить, какой способ загрузки страниц с показателями тИЦ из скрипта окажется быстрее, поскольку это в любом случае окажется самым узким местом в производительности парсера (любая обработка уже полученных данных, если она сделана без грубых ошибок типа бесконечного цикла, происходит гораздо быстрее загрузки этих данных по сети).

Для начала проверил на локальной машине (первый тест), затем на сервере (второй тест). Воспользовался модулем Benchmark::Timer, по сути он ставит метки начала и конца, после чего вычисляет разницу между ними (то же самое несложно получить с использованием Time::HiRes). У Benchmark::Timer правда есть дополнительная возможность — он может гонять тест до получения результата с заданной обеспеченностью и заданным процентом ошибки.

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

Выводы — библиотеки Perl не только выгодней с точки зрения безопасности, но и работают стабильно быстрее вызовов системных утилит. Самую медленную загрузку показал Wget, основывать парсер на нём — явно плохая идея. Многопточность естественно вне конкуренции. Подробности ниже.

Читать далее Сравнение производительности сетевых библиотек в Perl

Анонимайзер как замена прокси. Проверка анонимайзеров на валидность

Скрипт для составления и проверки списка веб-прокси

Наткнулся на любопытную заметку под названием «И еще немного про Google Hack«, в которой автор описывает использование анонимайзеров (пример анонимайзера — сайт Anonymouse) вместо публичных прокси для обхода капчи в Google.
Такой способ использования анонимайзеров мне тоже приглянулся и я решил написать свой скрипт для сбора и проверки на валидность списка публичных веб-прокси.

Читать далее Анонимайзер как замена прокси. Проверка анонимайзеров на валидность

Синхронизация текстовых файлов — простой скрипт на Perl

Случилось так, что мне стало очень нужно синхронизировать ограниченный набор файлов между флешкой и компьютером. При этом руками копировать туда-сюда, вспоминая, какой файл редактировал последним — утомительно, а «монстры» синхронизации излишни ввиду примитивности задачи, ведь рекурсивная синхронизация директорий и прочие навороты мне ни к чему.

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

Читать далее Синхронизация текстовых файлов — простой скрипт на Perl

Perl [Practical Extraction and Report Language]

Кратко о Perl

Perl — динамический язык программирования высокого уровня. Был задуман и начал создаваться как язык для удобной работы с текстовой информацией, отсюда вытекает основная особенность языка — строковой тип данных (строка представляет собой единый объект, а не массив отдельных символов, эту же особенность унаследовал от Perl язык PHP).

Язык знаменит своими мощными возможностями по обработке текстовых данных, что делает его весьма привлекательным для создания web-ориентированных cgi-скриптов и различных парсеров, использующих возможности регулярных выражений.

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

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

Интересные особенности Perl

Конструкция Switch/Case

Штатно возможность использовать конструкцию switch/case предусмотрена не была, однако это ограничение может быть обойдено достаточно простым и элегантным способом:

my %case = (
'action1' => \&action1,
'action2' => \&action2,
'actionN' => \&actionN,
);
my $action = 'action1';
$case{$action};

Помимо этого, можно использовать дополнительный модуль Switch, включив директиву use Switch;. В Perl6 конструкция switch/case встроена в интерпретатор.

Регулярные выражения в Perl

Мощная встроенная в язык поддержка регулярных выражений — это то, чем силён Perl. Основные операторы, используемые при работе с регулярными выражениями в Perl, это s///, m//, =~ и split (да, это тоже оператор).

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

Тема регулярных выражений отлично раскрыта в имеющейся в разделе «Библиотека» книге Mastering Regular Expressions (Регулярные выражения), издание второе.

Примеры программ на Perl

Парсер тИЦ

Простейший парсер значений тИЦ, написанный на Perl, может выглядеть так:

#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use LWP::Simple;

my $base_url = 'http://bar-navig.yandex.ru/u?ver=2&show=32&url=';
my $target_url = 'https://dimio.org';
my $content = get($base_url.$target_url);
die "Can't load tCY page!\n" if !$content;

if ( $content =~ m/^<tcy\srang="(\d{1,4})"\svalue="(\d{1,6})"\/>$/imsxo ) {
print 'Yandex Rang = '.$1.', Yandex tCY = '.$2,"\n";
}
exit 0;

Более продвинутый парсер ТИЦ — с параллельной загрузкой значений ТИЦ для переданного в скрипт списка сайтов — можно найти в разделе Софт.

Скрипт для автоматической смены IP-адреса в TOR

Для сети TOR (бесплатные рабочие SOCKS-прокси) можно сделелать Perl скрипт для автоматической смены НИМа / получения новго IP-адреса с использованием модуля Expect или при помощи модуля Net::Telnet.

Автоматическое наполнение WordPress контентом

Как и обещал, выкладываю скрипт для создания контента под блог на wordpress (о том, как наполнять блоги на wordpress контентом я уже писал в заметке Автоматическое добавление контента в WordPress-блоги).
Выкладываю опять же «как есть» — работоспособность присутствует, а осталное не гарантируется 🙂
Кстати, именно на основе этого скрипта и родилась бесплатная программа для создания импортируемого в WordPress XML-файла — WordPress XML Creator.
Читать далее Автоматическое наполнение WordPress контентом

Автоматическое добавление контента в WordPress-блоги

Ещё где-то в одной из первых записей обещал выложить Perl-скрипт, которым раскладывал контент по сетке блогов (работает напрямую с базой данных wordpress). Только недавно об этом вспомнил 🙂
Выкладываю как есть (т.е. он полностью работоспособен, а эстетические ляпы пусть остаются), внутри в общем-то всё довольно понятно (на мой взгляд) описано. Почти все настройки вынесены в начало скрипта (настройки БД для wp-блогов см. со строки 155).

Сам скрипт только наполняет базы сетки блогов (таблицы для всех блогов сетки хранятся внутри одной БД) и обновляет информацию о времени публикации записей, контент для него должен быть подготовлен заранее (скрипт для подготовки контента тоже выложу на днях), для хранения подготовленного контента используется ДБ в формате SQLite3.

Открыть код скрипта в новом окне.

Пополнение библиотеки — Perl Cookbook

Perl Сборник рецептов для профессионалов - скачать бесплатно

Сегдняшней книге, пополнившей «Библиотеку» сайта, решил посветить отдельную заметку — она этого заслуживает.

Книга носит название «Perl. Сборник рецептов для профессионалов (Perl cookbook)» (второе издание) и представляет собой собрание готовых решений на perl для огромного круга типичных задач, с которыми возможна встреча на практике.

Материал изложен доступно, структура продуманная, рецепты готовы к применению 🙂

Книгу должно иметь и глупо не пользоваться ей.

Pastebin из консоли. Просто и удобно.


Стал часто пользоваться сервисом pastebin и добавлять свои заметки через браузер руками быстро надоело.
Поискал и нашел в репозитории программку pastebinit — не устроила из-за ограничений по работе с pastebin-сервисами (чтобы добавили новый сервис — надо написать автору и ждать-ждать-ждать — не очень интересно), тем более, что я как раз на хостинге сделал свой сервис на стандартном движке pastebin, чтобы не иметь проблем с кодировкой (pastebin по умолчанию работает не в unicode), да и просто из интереса.
Читать далее Pastebin из консоли. Просто и удобно.

Автоматическое определение кодировки терминала в perl-скрипте.

Надоело руками менять кодировки для нормального вывода русского текста в своих perl-скриптах в зависимости от кодировки терминала (запускаю скрипты под Linux (utf8), Windows (ActivePerl, cp866) и Windows (Cygwin, cp1251)). Немного погуглил, но никаких готовых рецептов не встретил, хороший запрос для поиска что-то в голову не пришёл.

Решил поступить следующим образом — определять операционную систему, в которой запущен скрипт, и в зависимости от этого выставлять кодировку выходного потока (STDOUT):

#!/usr/bin/perl;
use utf8;
require encoding;
import encoding  ('utf8', 'STDOUT' => &SetEncoding);

sub SetEncoding {
    if ($^O =~ /^MSWin\d{2}$/i) {
        return 'cp866';
    }
    elsif ($^O =~ /^cygwin$/i) {
        return 'cp1251';
    }
    elsif ( условие для следующей ОС (например - linux) ) {
        return 'utf8';
    }
    # и так далее, исходя из личных потребностей
}

Замечания, исправления, дополнения и/или другие способы решения задачи по автоматической установке кодировки для perl-скрипта всегда приветствуются!

И на всякий случай, если вдруг мне не удастся найти время написать ещё что-то в блог до нового года — поздравляю всех своих читателей с наступающим новым годом, успехов вам и побольше приятных открытий! 🙂

PS: А для интересующихся фрилансом — новый, но достаточно любопытный ресурс ФрилансFM — портал о фрилансе.

Парсер базы nakolesah.ru

Грабим nakolesah.ru
Пример работы парсера сайта nakolesah.ru

Уф, докрутил парсер nakolesah до вменяемого состояния и сграбил подбор шин по автомобилю. Кому интересно — ссылка на сам скрипт в конце поста.

Что-то в нём ещё буду менять, не очень мне нравится логика работы нынешняя, основанная на GET-запросах (тогда как браузер получает всю информацию, обращаясь к asp-скрипту с передачей разных параметров в POST-запросе). У меня POST только в конце, а надо бы попробовать работу браузера полностью скопировать, да времени особо не было разбираться.

Читать далее Парсер базы nakolesah.ru