Статьи по меткам ‘Perl’

Perl: DBI & MySQL — авто реконнект (reconnect)

Декабрь 27th, 2011

Если вы программист на Perl и работаете с MySQL, то вот вам совет, как обеспечить коннект к серверу, и в тоже время, обеспечить себе легкую жизнь. Ведь если истечёт таймаут при работе с сервером, $dbh (database handle) будет не актуальным и выдаст ошибку. Особенно это актуально тогда, когда ваша программа работает с MySQL, и в то же время выполняет другие длительные операции, время которых может превысить таймаут-значение (connect timeout) MySQL. В такой ситуации ваш handle будет не актуальным.

Решение есть. Но в то же время есть ещё одна тонкость. DBB::mysql драйвер имеет опцию автореконнекта (mysql_auto_reconnect) и будет следить за актальностью handle и при случае переконнектится. Но вот что делать с коммандами, которые иногда надо выполнить сразу после коннекта, например SET NAMES ‘utf8′;SET CHARACTER SET ‘utf8′ ? И тут есть решение! Хотя найти его не всегда легко в интернет :)

Вообщем, вот код для коннекта из под Perl к MySQL так, чтобы всё работало пучком:

$dbh = DBI->connect( "dbi:mysql:database=database_name;mysql_client_found_rows=1;mysql_enable_utf8=1;mysql_socket=/socket_of_mysql", 'user', 'password',
    {
	RaiseError		=> 1,
	AutoCommit		=> 1,
	mysql_multi_statements	=> 1,
	mysql_init_command	=> q{SET NAMES 'utf8';SET CHARACTER SET 'utf8'}
    } ) or die "Cannot connect";
$dbh->{mysql_auto_reconnect} = 1;

Код проверен мною и тщательно протестирован

Музеи бывают разные…

Октябрь 27th, 2011

Вот пришла мне сегодня такая мысль: программирование — это тоже искусство, код бывает написан так, что грамотный программист может долго восхищаться тем, как он написан и потом черпать от туда идеи для вдохновления. Например, если говорить о perl — мне очень нравится, как пишет код Tatsuhiko Miyagawa, и что самое интересное — он много очень написал. Например, много полезных приёмов можно подчерпнуть даже в таком хорошем и полезном инструменте для парсинга html & xml, как Web::Scraper — простой то туда пример для программеров перла ;-)

Дак вот, я о том, что раз программирование — это искусство, то почему бы, подумал я, не открыть где нибудь музей, где вместо картин были бы исходные коды. Потом моя мысль пошла дальше — мол код интереснее смотреть на экране компа, тем более в цифровом виде — чтобы легче было копипасты делать, проверить если что и т.п.. Значит, музей должен быть в интернете! И вот, подумал я, наверное, я один до этого додумался ;-) Погуглил — как бы не так… Опередили меня ровно на год! По крайней мере в русском сегменте сети.

Итак, встречайте музей программного кода! :)

Термин «Lexical scope» в Perl

Сентябрь 8th, 2011

Довольно часто в документации к Perl встречается такой термин, как Lexical Scope. Однако лично я пока не нашел точного определения этому термину в man-ах perl-а. Порывшись в интернете, нашел все таки точное определение этому термину.

В терминах Perl, lexical scope определяется либо границами файла-исходника (если было за пределами первого блока в файле), либо блоком, в котором определен ({…}), либо внутри «eval». Поскольку блоки могут быть вложенными, то и lexical scope может быть вложенным. Это очень важно понимать, так как некоторые директивы имеют именно этот lexical scope (my, our, package)

perl, utf8 и encode & decode термины

Июль 20th, 2011

Полезно будет знать Perl программерам. Дело в том, что часто в документациях к perl (perldoc utf8) и модулям (например JSON) употреблаются такие термины, которые лично меня часто путали своим смыслом, а именно: encode to UTF-8, decode to UTF-8. Что подумает нормальный программер, услышав слово encode to? То, что что-то кодируется во что-то, а именно «encode to UTF-8″ -> «кодирование в UTF-8″. Я знаю, что perl хранит внутри себя строки UTF-8 со специальным флагом — если он установлен — строка UTF-8, если нет — бинарная. Поэтому, когда в доке я читал encode to UTF-8, я все время путался — думал, что говорят про установку этого флага. Оказалось, все в точности наоборот.

Правильно так: когда пишут encode to UTF-8, это значит, что внутри перла строка с UTF-8 данными остается как есть, но флаг UTF-8 убирается, и perl начинает вести себя со строкой так, как будто там бинарные (octet) байтовые данные (то есть посути, строка внутри перла перестает быть UTF8, хотя слово «encode» несет в себе другой смысл). И наоборот — decode to UTF-8 -> UTF8 флаг ставится (то есть для perl-а строка становится UTF8).

P.S. В Perl есть такая функция — encode (модуль Encode). Смысл ее в том, чтобы перевести строку из внутреннего содержания на perl (которое всегда UTF-8 внутри, т.е. Unicode символы) в байтовую последовательность, которая бы отражала ту кодировку, которую ей указали (то есть раз байтовая — значит всегда utf8 флаг в результате отсутсвует). Если мы делаем $result = encode(‘utf-8′, $string), то результат как раз будет в том, что флаг utf8 будет просто снят для $result и в реальности никакого переводирования не будет (то есть побайтово внутри perl-а $string & $result будут содержать одни и те же байты, только $string еще будет иметь взведенный utf8 флаг). И это как раз вписывается в те понятия, которые я описал ранее. Для decode и байтового UTF8 всё обратно — флаг utf8 просто ставится в $result.

Вот такая абракодабра… Будьте внимательны!

Немного о супер направлениях в Web на Perl

Июль 19th, 2011

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

Я сам программирую динамические веб сайты (CGI) только на Perl. Никогда не использовал PHP. Это не только потому, что я фанат Perl, но и дань эффективности — под Perl много модулей, много возможностей, и при грамотном подходе сайты на Perl будут работать быстрее PHP — ведь Perl код после компиляции хранится в памяти в виде байт кода (типа «Пи кода» кода в Pascal). А если знаешь Perl, то и разработка может идти гораздо быстрее. » Читать дальше: Немного о супер направлениях в Web на Perl

Perl — перекрестные ссылки и «утечка памяти»

Март 28th, 2011

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

Маленькое вступлениеperl имеет механизм чистки уже неиспользуемых переменных. Работает просто » Читать дальше: Perl — перекрестные ссылки и «утечка памяти»

Perl — надо ли делать свой дистрибутив проекта?

Июнь 23rd, 2010

Если вы программер на perl, и читаете эту статью, то вы навярняка задавались вопросом — как устанавливать ваши скрипты, надо ли вообще делать дистрибутив, даже если вы не распространяете проект? Я несколько лет использовал свои скрипты, устанавливая их обычным копированием в отдельную папку и прописывая до нее путь, например через строки кода use lib qw(/path1 /path2) и т.п.. Такие скрипты работали, проблем не возникало, и я вообще не думал о дистрибутивах. Затем, понадобилось устанавливать несколько своих скриптов на несколько серваков, вот тогда я и сделал свой первый дистрибутив. Но до недавнего времени, я придерживался взгляда, что дистрибутив нужен только для публичного распространения, или когда вам надо использовать свои разработки на нескольких серваках. Но так ли это на практике?

» Читать дальше: Perl — надо ли делать свой дистрибутив проекта?

sed — некоторые тонкости regexp

Октябрь 29th, 2009

До недавнего времени сколько бы я не делал попыток написать для sed хоть мало мальское регулярное выражение, оно у меня не работало. Я не мог понять в чем дело, ведь там синтаксис должен быть практически такой же, как в perl. Но для меня Sed оставался странной лошадкой, которую хотелось бы обуздать, но не получалось.

И вот, наконец, сегодня я прочел грамотную доку, а также в другом месте нашел объяснение моим проблемам. Оказывается, в sed есть очень мелкие, но важные отличия, поняв которые, вы сможете писать sed команды легко.

Итак, оказывается, по историческим причинам, чтобы не нарушать работу старых sed команд, в sed группировка (‘(‘, ‘)’) и некоторые другие спец. символы (‘+’ , ‘?’) были заменены на символы со слешем. Вот эти отличия:

В языке Perl В sed редакторе Пояснение
(…) \(…\) Группировка
{X,Y} \{X,Y\} Заданный множитель
+ \+ Повторитель — один и более раз
? \? Повторитель — один или ноль раз
\bfoo\b \<foo\> поиск ‘foo’ с границами слова
$1, $2 \1, \2 Подмена на группу

Самое главное, на чем я спотыкался всегда — я никак не мог додуматься, что ‘\’ должен ставиться перед ‘(‘, или перед ‘?’ и ‘+’ символами, например. Я видел иногда эти слеши в примерах, но я думал, что эти слеши относились к shell, но оказалось, что это тонкость sed-а.

P.S. Возникает вопрос, а как же тогда заменять сами символы: «?+{}()» в sed? А оказывается, их просто не надо ескейпить символом ‘\’. Получается как бы наоборот — эти символы сами по себе не ескейпяться, а когда нужно их специальное назначение, то перед ними ставим ‘\’. Типа все с ног на голову, если сравнивать с perl.

Чуть позже я выяснил, что у sed есть ключик запуска ‘-r’, который, собственно, переключает sed в тот режим, который работает со спецсимволами уже без слеша (то есть так, как привыкли perl программисты). Поэтому, есть второй вариант: просто добавить ключ -r в sed запуска, и усё будет работать по привычному ;-)

Share to Facebook Share to Twitter Stumble It More...