воскресенье, 27 сентября 2015 г.

Делаем, как взрослые, указываем номер версии программы

В перл номер версии хранится в глобальной переменной $VERSION, доступ к которой можно получить явно $ModuleName::VERSION, либо используя стандартный для всех модулей метод: ModuleName->VERSION.

Есть несколько способов нумерации модулей. Рассмотрим, два наиболее распространённых способов это АА.АА и АА.АА.АА версии, где А - это любое число.

четверг, 24 сентября 2015 г.

Каталог SQL-запросов

Для случая, если в проекте используется много SQL-запросов, имеет смысл вынести их в отдельный модуль(и), в котором организовать их храненение в виде хеша, ключи которого будут указывать назначение конкретного запроса. Эдакая разновидность документации непосредственно с использованием кода. Само же хранение всех SQL-запросов в одном месте упрощает их использование.

Пример:

Упрощаем доступ к хешу по ключу, с использованием $; переменной

use strict;
use warnings;

$\="\n";

# Предположим, что имеется некоторый хеш, ключи которого выглядят так:

my %foo = (
    'Close|___|your|___|window' => 'Closed',
    'Open|___|the|___|door'     => 'Opened',
    'Just|___|three|___|words'  => 'Amazing' 
);

# т.е. в имени ключа используется разделитель '|___|'.
# И для того, чтобы не писать весь этот ужас каждый раз в имени ключа,
# перл предоставляет небольшое упрощение для данной задачи.
# К примеру, вместо вот этого:

print $foo{'Open|___|the|___|door'};
print $foo{'Just|___|three|___|words'};

print '-' x 15;
# можно написать вот так:

$; = '|___|'; # в данной ситуации эта волшебная переменная,
                  # позволяет настраивать разделитель
                  # для доступа к элементам хеша по ключу.
print $foo{'Open', 'the', 'door'};
print $foo{'Just', 'three', 'words'};

# но можно сделать еще более читабельным наименование ключа:
print $foo{qw/Close your window/};

# Итог, при любом способе, будет предсказуем:
#
# Opened
# Amazing
# ---------------
# Opened
# Amazing
# Closed

понедельник, 21 сентября 2015 г.

Пара слов об IPC

IPC:

    сигналы;
    очереди;
    каналы;
    безопасные подпроцессы;
    сокеты;
    семафоры.

Perl использует возможности юникс для реализации IPC: сигналы, именованные каналы, каналы, сокеты, SysV IPC вызовы.

Не так страшен goto, как его малюют

goto LABEL
goto EXPR
goto &NAME


goto LABEL - продолжить выполнение с LABEL. С помощью неё нельзя войти в подпрограмму, цикл и любую другую конструкцию, для которой необходимо задать начальные условия.

воскресенье, 20 сентября 2015 г.

Особенность использования warn, die с "\n"

perl v5.18.2

Поведение warn с использованием символа новой строки "\n":

test.pl
warn "Hello";
warn "World\n";
warn "Wor\nld";

perl test.pl
Hello at m.pl line 4.
World
Wor
ld at m.pl line 6.

Отладка, включаем и выключаем по желанию

"Наиболее эффективным инструментом отладки всё ещё 
остаётся внимательное размышление, связанное с 
благоразумно расположенными print выражениями."
Брайн Керниган "Unix для начинающих. 1979 г"

Такую возможность для управляемой отладки предоставляет глобальная переменная $DEBUG в модуле, который мы хотим отлаживать время от времени. Сами же отладочные вызовы должны срабатывать только при истинном значении $DEBUG. Включать и выключать отладочный режим можно простым переопределением значения переменной $DEBUG в программе, которая использует данный модуль.