class DarkRaha extends com { // разработка приложений
            String a="Главная" b="Контакты" c="О сайте"
};

основы

введение
инструментарий
типы данных
переменные
литералы
строки
массивы
отображения
ссылки
операции
управляющие операторы
функции
пакеты, модули

разное

переменные окружения
MySQL

Справочник по Perl

шаблон модуля пакета

Ниже приведен более-менее типичный шаблон модуля пакета. По возможности каждая строчка кратко прокомментирована, более подробно некоторые вещи разъясняются в следующих пунктах.

 # предполагается файл Some/Modulename.pm
package Some::Modulename;  

    use strict;
    use warnings;

    BEGIN {
        # подключаем модуль Exporter для экспорта имен
        use Exporter   ();  
        
        # объявляем переменные доступные в модуле
        # до perl 5.6 использовалась директива vars
        #  use vars qw($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
        our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
        
        $VERSION = 1.00; #  указываем версию
        # если используется RCS/CVS, то можно так
        # $VERSION = sprintf "%d.%03d", q$Revision: 1.1 $ =~ /(\d+)/g;

        # в смысле ООП данный массив определяет родительские пакеты
        # в данном случае пакет Exporter
        @ISA = qw(Exporter);
        
        # в этот массив помещаются имена, которые будут добавлены
        # в пространство имен вызывающего пакета
        # не забываем, что в qw разделителем является пробел, а не запятая
        @EXPORT = qw(&func1 &func2 &func4);
        
        %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],

        # перечисляем доступные имена пакета
        @EXPORT_OK = qw($pvar %phash &func3);
        ...
    }
    # our @EXPORT_OK;

    # объявляем глобальные переменные пакета
    # эти будут экспортированы
    our ($pvar, %phash);

    # а эти не будут экспортированы
    our (@pvar2, %phash2);

    # инициализируем наши переменные
    $pvar="hello world";
    ...

    # все локальные имена должны быть объявлены
    # до их использования функциями

    # локальные переменные
    # или в смысле ООП приватные члены
    my $pscalar = "";
    my %phash = ();

    # приватная функция вызываемая как &$priv_func    
    my $priv_func = sub {...};

    # объявляем функции пакета с прототипом или без
    sub func1      {...}    
    sub func2()    {...}    
    sub func3($$)  {...}    

    # эта не экспортируемая функция
    # но доступна для вызова
    sub func4(\%)  {...}

    END { ... } # код очистки 
  
    1;  # при выходе из этого модуля будет возвращена истина 

определение модуля

Имя пакета указывается директивой package. Далее идет содержимое пакета - до конца блока или файла. По умолчанию каждый модуль (файл со скриптом) относится к пакету main.

{package Nested; # это вложенный пакет 
...  
}

таблица символов

С каждым пакетом связана одноименная хеш-таблица символов, содержащая ссылки на определенные в пакете имена.

именованные блоки

Модуль может иметь именованные блоки специального назначения:

Если определено несколько одноименных блоков, то они выполняются последовательно, по мере определения.

подключение пакетов

Используемые пакеты указываются одним из следующих способов:

require Cwd;              
$here = Cwd::getcwd(); # ок

use Cwd;                  
$here = getcwd(); # ок

require Cwd;              
$here = getcwd(); # ошибка

use Module;
   #эквивалентно
BEGIN {require Module; import Module;}   

use Module ();
   #эквивалентно
BEGIN { require Module; }

различия our и use vars

Переменные объявленные с помощью директивы use vars видны только в том пакете модуля, в котором объявлены.

 use strict;
# объявляем переменную в пакете по умолчанию, т.е. main
# $main::str 
use vars qw($str); 
$str="56\n";
{ package Test; # это вложенный пакет в нем $str не виден
  
  # ошибка компиляции $Test::str не разрешен
  #print $str;
  
  # но можно так 
  print $main::str;
}

# мы опять в пакете main, так что можно без $main::
print $str; 

Переменные объявленные с помощью our видны во вложенных пакетах. Сравните следующий пример с предыдущим.

use strict;
our $strmain="hello "; 

{ package Test;
  our $strtest="world\n"; 
  print $strmain; # можно 
  print $strtest; # можно
} 

print $strmain; # ок

# ошибка компиляции 
# print $strtest; 
 
print $Test::strtest; # но можно так

инсталяция модуля

Новый модуль нужно скопировать в директорию библиотек perl. Например, в ActivePerl для Windows это поддиректории lib и site/lib в месте инсталляции. Если есть менеджер пакетов как в ActivePerl, то можно воспользоваться им (запуск в командной строке ppm).


Рейтинг@Mail.ru