|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 31 Jul 2002 18:49:26 To : Artem Chuprina Subject : Re: export -------------------------------------------------------------------------------- Artem Chuprina wrote: > Здравствуй, Vitaly Gonchar. > > VG> хочу сделать файлик, где описать все мои константы, а потом из остальных > VG> программ к ним обращаться (типа файлов .h в С) > > VG> в вызывающей программе пишу > VG> use myheader; > > VG> $vvv = myheader::vvv; > > Hу, для начала $vvv = $myheader::vvv; > > Для потом, а зачем? Это все-таки не C, а злоупотребление глобальными > переменными не рулез. > ... Приведенный человеком пример не есть "злоупотребление глобальными переменными", а как раз-таки использование констант. И вызов $vvv = myheader::vvv; он написал правильно. Осталось только подсказать ему, что константы описывают как функции с пустым списком прототипов, возвращающие константные значения. Такие функции - потенциальные кандидаты на inline. Можно, (а если не закладываться на поддержку старых версий perl, то и, наверное, уже нужно) использовать модуль constant.pm (см. perldoc constant). Пример: package MyAppErrors; use strict; sub ERR_BADPASSWORD() { -1; } sub ERR_CLOSEDACCOUNT() { -2; } ... 1; либо: package MyAppErrors; use strict; use constant ERR_BADPASSWORD => -1; use constant ERR_CLOSEDACCOUNT => -2; ... 1; Модуль Exporter нужен только в случае, если Вы собрались экспортировать данные функции в пространство имен вызывающего контекста. Простейший пример: package MyAppErrors; use strict; use base qw(Exporter); our @EXPORT = qw(ERR_BADPASSWORD ERR_CLOSEDACCOUNT); our @EXPORT_OK = qw(ERR_UNKNOWN ERR_FATALCORRUPTION); use constant ERR_BADPASSWORD => -1; use constant ERR_CLOSEDACCOUNT => -2; use constant ERR_UNKNOWN => -3; use constant ERR_FATALCORRUPTION => -4; use constant MAXERRNUM => -4; 1; ---------- и в вызывающем контексте ------------ use MyAppErrors qw(ERR_UNKNOWN); ... if ($pass ne $user->pass) { log("damn..."); return ERR_BADPASSWORD; # Может быть использовано без указания package, # поскольку импортировано по умолчанию } else { return ERR_UNKNOWN; # Может быть использовано без указания package, # поскольку импортировано по требованию } ... return MyAppErrors::ERR_FATALCORRUPTION; # не импортирована, указываем package ------------ Андрей P.S. чуть не забыл! см. perldoc Exporter ;-) --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/52846d15966a.html, оценка из 5, голосов 10
|