Perl: Тернарный оператор ?:

Когда Ларри выбирал, какие операторы должны быть доступны в Perl, он не захотел обижать бывших программистов C. А это значит, что в Perl переносится и самый запутанный оператор C – тернарный оператор ?:. Впрочем при всей запутанности он может быть весьма полезен. Тернарный оператор напоминает проверку ifQthenQelse, упакованную в одно выражение. Оператор называется «тернарным», потому что он получает три операнда. Оператор выглядит примерно так: 

выражение ? выражение_для_true : выражение_для_false

Абсолютный путь файла perl-скрипта

Бывает, когда нет ssh-доступа и возможности набрать команду pwd, нужно узнать полный путь к файлу. В данном случае выручает библиотека File::Spec.

Пример использования:

use File::Spec;
$path = File::Spec->rel2abs($0);

Perl: рандомный элемент из массива

Пример вывода случайного элемента из массива на Perl:

my @arr = ('foo', 'bar', 'baz');
print random(@arr);

sub random {
	my @values = @_;
	return $values[int rand scalar @values];
}

Работа с фреймворком Mojolicious

В тексте заметки несколько приемов работы с фреймворком Mojolicious, которые серьезно упрощают жизнь.

Установка perl-модуля без root-доступа

С необходимостью установки модуля со CPAN я столкнулся при пользовании виртуальным хостингом без прав супер-пользователя (root).

В этом случае поможет local::lib.

wget http://search.cpan.org/CPAN/authors/id/H/HA/HAARG/local-lib-2.000017.tar.gz
tar zxf local-lib-2.000017.tar.gz
cd ~/local-lib-2.000017
perl Makefile.PL --bootstrap
make test && make install
echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc

Постфиксное разыменование

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

$array_ref->@*; # вместо @{ $array_ref }
$hash_ref->%*;  # вместо %{ $hash_ref }

Пример работы с 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);