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

Подключение к PostgreSQL:

my $pg = Mojo::Pg->new; $pg->from_string('postgresql://[mylogin]:[mypassword]@[myhost]/[mydb]');

Добавление записи:

$pg->query('insert into mytable (name,age) values (?,?)', 'MyName', '10');

Удобный вид выбираемых данных:

$pg->query('select * from mytable where id = ?', 1)->hash; # хэш одной записи
$pg->query('select * from mytable')->hashes->to_array;     # массив хэшей

Perl функции: bless

После выполнения функции bless() ссылка на субъект Perl (переменную, массив или хеш), определенная параметром ССЫЛКА, становиться ссылкой на объект, определяемый пакетом с именем, равным значению параметра ИМЯ_КЛАССА. Если этот параметр не задан, то подразумевается текущий пакет.Возвращаемое значение - ссылка на объект.

bless ССЫЛКА, ИМЯ_КЛАССА
bless ССЫЛКА

XML::LibXML. Создание xml-документа

Данный пример perl-кода, основанный на библиотеке XML::LibXML, генерирует xml-документ.

use XML::LibXML;
 
my $doc    = XML::LibXML::Document->new('1.0', 'utf-8');
my $create = $doc->createElement('object');
   $create->setAttribute('attribute', 'value');
   $doc->setDocumentElement($create);

my $document = $doc->createElement('tag');
   $create->appendChild($document);

my $name_doc = $doc->createElement('name');
   $name_doc->appendText('name');
   $document->appendChild($name_doc);

open my $out, '>', 'file.xml';
print {$out} $doc->toString(2);

Perl: парсинг gpx-трека

 Структура gpx-трека выглядит примерно таким образом. Внутри тега <trkpt> могут быть также time, ele.

<?xml version="1.0" encoding="utf-8"?>
<gpx>
    <trk>
        <name>Track</name>
        <trkseg>
            <trkpt lat="87.89289951324463" lon="41.97881025520548"></trkpt>
            <trkpt lat="87.7565735578537" lon="41.85182988575514"></trkpt>
        </trkseg>
    </trk>
</gpx>

CDATA с помощью XML::LibXML

CDATA (character data — символьные данные) используется в языках разметки XML для отображения символьных данных. Раздел CDATA начинается последовательностью символов "<![CDATA[" и заканчивается "]]>".

При создании xml-документов с CDATA на Perl я использую библиотеку XML::LibXML::CDATASection.

Рассмотрим пример: 

use XML::LibXML;

my $cdata = new XML::LibXML::CDATASection('symbols <>');
print $cdata->toString, "\n";
# результат: <![CDATA[symbols <>]]>

my $text = new XML::LibXML::Text('symbols <>');
print $text->toString, "\n";
# результат symbols &lt;&gt;

Perl: все файлы каталога

Задача:

Необходимо получить имена всех файлов каталога в массив @files.

Решение:

Откроем каталог функцией opendir и последовательно считаем имена файлов функцией readdir:

my $dir = '/home/dir_name';
my @files;

opendir(DIR, $dir) or die "can't opendir $dir: $!";

while (defined(my $file = readdir(DIR))) {
	next if $file =~ /^\.\.?$/;
	push @files, $file;
}

closedir(DIR);

Ошибка ImageMagick: Resource temporarily unavailable

Проблема:

При запуске скрипта с использованием ImageMagick на виртуальном хостинге возникла ошибка:

libgomp: Thread creation failed: Resource temporarily unavailable

ImageMagick использует алгоритм, который может выполняться в нескольких параллельных потоках. Но на виртуальном хостинге каждому пользователю выделяется определённое количество потоков, превысить которое он не может и если это произойдет - возникает ошибка «Thread creation failed: Resource temporarily unavailable».

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

Несколько примеров регулярных выражений.

LWP::UserAgent и кириллические .рф

На cpan есть прекрасный и хорошо вам знакомый модуль LWP::UserAgent

Запустив нижеследующий тестовый скрипт с кириллическим доменом вида http://россия.рф, мы получим 500-ую ошибку вида: 500 Can't connect to xn--aca0d8k7a0jdddbd.xn--ai3ub:80 (Bad hostname)

require LWP::UserAgent;
 
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;
 
my $response = $ua->get('http://россия.рф/');
 
if ($response->is_success) {
	print $response->decoded_content;
}
else {
	die $response->status_line;
}

Perl: регулярные выражения для работы с URL

В очередной раз язык Perl доказывает свою гибкость, универсальность. Как поговаривал Ларри Уолл: "Это можно сделать разными способами". Под катом несколько примеров работы с URL-адресами.

perl регулярные выражения url