Spec-Zone.ru › Perl 5.36

постоянная

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНОПСИС
  • ОПИСАНИЕ
  • ПРИМЕЧАНИЯ
    • Список констант
    • Определение нескольких констант одновременно
    • Магические константы
  • ТЕХНИЧЕСКИЕ ПРИМЕЧАНИЯ
  • ОГРАНИЧЕНИЯ
  • СМОТРИТЕ ТАКЖЕ
  • ОШИБКИ
  • АВТОРЫ
  • АВТОРСКИЕ ПРАВА И ЛИЦЕНЗИЯ

ИМЯ

constant - прагма Perl для объявления констант

СИНОПСИС

use constant PI    => 4 * atan2(1, 1);
use constant DEBUG => 0;

print "Pi equals ", PI, "...\n" if DEBUG;

use constant {
    SEC   => 0,
    MIN   => 1,
    HOUR  => 2,
    MDAY  => 3,
    MON   => 4,
    YEAR  => 5,
    WDAY  => 6,
    YDAY  => 7,
    ISDST => 8,
};

use constant WEEKDAYS => qw(
    Sunday Monday Tuesday Wednesday Thursday Friday Saturday
);

print "Today is ", (WEEKDAYS)[ (localtime)[WDAY] ], ".\n";

ОПИСАНИЕ

Эта прагма позволяет объявлять константы во время компиляции.

Когда вы объявляете константу, например, PI с помощью метода, показанного выше, у каждой машины, на которой выполняется ваш скрипт, может быть столько цифр точности, сколько она может использовать. Кроме того, ваша программа будет легче читаться, вероятнее всего, будет поддерживаться (и поддерживаться правильно) и гораздо меньше вероятность отправки космического зонда на неправильную планету, потому что никто не заметил единственное уравнение, в котором вы написали 3.14195.

Когда константа используется в выражении, Perl заменяет её значение во время компиляции и может далее оптимизировать выражение. В частности, любой код в блоке if (CONSTANT) будет оптимизирован, если константа ложна.

ПРИМЕЧАНИЯ

Как и во всех директивах use , определение константы происходит во время компиляции. Поэтому, вероятно, неверно помещать объявление константы внутри условного оператора (например, if ($foo) { use constant ... }).

Константы, определённые с помощью этого модуля, не могут быть интерполированы в строки как переменные. Однако конкатенация работает нормально:

print "Pi equals PI...\n";        # WRONG: does not expand "PI"
print "Pi equals ".PI."...\n";    # right

Даже если ссылка объявлена как константа, ссылка может указывать на данные, которые могут быть изменены, как показано в этом коде.

use constant ARRAY => [ 1,2,3,4 ];
print ARRAY->[1];
ARRAY->[1] = " be changed";
print ARRAY->[1];

Константы принадлежат пакету, в котором они определены. Чтобы обратиться к константе, определённой в другом пакете, укажите полное имя пакета, как в Some::Package::CONSTANT. Константы могут экспортироваться модулями и могут также вызываться как методы класса или экземпляра, то есть как Some::Package->CONSTANT или как $obj->CONSTANT , где $obj является экземпляром Some::Package. Подклассы могут определять свои собственные константы, чтобы переопределять константы базового класса.

Начиная с версии 1.32 этого модуля, константы можно определять в пакетах, отличных от вызывающего, включив имя пакета в имя константы:

use constant "OtherPackage::FWIBBLE" => 7865;
constant->import("Other::FWOBBLE",$value); # dynamically at run time

Использование заглавных букв для имён констант — всего лишь соглашение, хотя рекомендуется, чтобы константы выделялись и для предотвращения коллизий с другими ключевыми словами, словами и именами подпрограмм. Имена констант должны начинаться с буквы или символа подчёркивания. Имена, начинающиеся с двух символов подчёркивания, зарезервированы. Некоторые неудачные имена будут генерировать предупреждения, если предупреждения включены во время компиляции.

Список констант

Константы могут быть списками из более (или менее) чем одного значения. Константа без значений оценивается как undef в скалярном контексте. Обратите внимание, что константы с более чем одним значением не возвращают своё последнее значение в скалярном контексте, как можно было бы ожидать. В настоящее время они возвращают количество значений, но это может измениться в будущем. Не используйте константы с несколькими значениями в скалярном контексте.

ПРИМЕЧАНИЕ: Это подразумевает, что выражение, определяющее значение константы, оценивается в контексте списка. Это может привести к неожиданным результатам:

use constant TIMESTAMP => localtime;                # WRONG!
use constant TIMESTAMP => scalar localtime;         # right

Первая строка выше определяет TIMESTAMP как список из 9 элементов, как возвращается localtime() в контексте списка. Чтобы задать строку, возвращаемую localtime() в скалярном контексте, требуется явное ключевое слово scalar.

Константы-списки — это списки, а не массивы. Для индексирования или срезов их необходимо поместить в скобки.

my @workdays = WEEKDAYS[1 .. 5];            # WRONG!
my @workdays = (WEEKDAYS)[1 .. 5];          # right

Определение нескольких констант одновременно

Вместо написания нескольких use constant операторов вы можете определить несколько констант в одном операторе, указав вместо имени константы ссылку на хеш, где ключами являются имена констант, которые нужно определить. Очевидно, что все константы, определённые с помощью этого метода, должны иметь единственное значение.

use constant {
    FOO => "A single value",
    BAR => "This", "won't", "work!",        # Error!
};

Это фундаментальное ограничение способа построения хешей в Perl. Сообщения об ошибках, которые появляются в этом случае, часто бывают довольно загадочными — в худшем случае их вообще не будет, и вы обнаружите это только позднее, что что-то сломано.

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

use constant {
    BITMASK => 0xAFBAEBA8,
    NEGMASK => ~BITMASK,                    # Error!
};

Магические константы

Магические значения и ссылки могут быть преобразованы в константы во время компиляции, что позволяет создавать очень интересные вещи, такие как это. (Эти номера ошибок не полностью переносимы, увы.)

use constant E2BIG => ($! = 7);
print   E2BIG, "\n";        # something like "Arg list too long"
print 0+E2BIG, "\n";        # "7"

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

ТЕХНИЧЕСКИЕ ПРИМЕЧАНИЯ

В текущей реализации скалярные константы фактически являются встраиваемыми подпрограммами. Начиная с версии 5.004 Perl, соответствующая скалярная константа вставляется непосредственно вместо некоторых вызовов подпрограмм, тем самым экономя издержки вызова подпрограммы. См. "Constant Functions" в perlsub для получения подробной информации о том, как и когда это происходит.

В редком случае, когда вам нужно узнать во время выполнения, объявлена ли конкретная константа с помощью этого модуля, вы можете использовать эту функцию для проверки хеша %constant::declared. Если имя данной константы не включает имя пакета, используется текущий пакет.

sub declared ($) {
    use constant 1.01;              # don't omit this!
    my $name = shift;
    $name =~ s/^::/main::/;
    my $pkg = caller;
    my $full_name = $name =~ /::/ ? $name : "${pkg}::$name";
    $constant::declared{$full_name};
}

ОГРАНИЧЕНИЯ

Константы-списки не встраиваются, если вы не используете Perl версии 5.20 или выше. В версии 5.20 или выше они всё ещё не являются неизменяемыми, но это может измениться в будущих версиях.

Невозможно иметь подпрограмму или ключевое слово с тем же именем, что и константа в том же пакете. Это, вероятно, хорошо.

Константа с именем в списке STDIN STDOUT STDERR ARGV ARGVOUT ENV INC SIG не разрешена нигде, кроме пакета main::, по техническим причинам.

В отличие от констант в некоторых языках, их нельзя переопределять в командной строке или через переменные среды.

Вы можете попасть в беду, если используете константы в контексте, который автоматически приводит к цитированию псевдослов (как это верно для любого вызова подпрограммы). Например, вы не можете сказать $hash{CONSTANT}, потому что CONSTANT будет интерпретироваться как строка. Используйте $hash{CONSTANT()} или $hash{+CONSTANT} для предотвращения включения механизма цитирования псевдослов. Аналогично, поскольку оператор => цитирует псевдослово непосредственно слева от него, вы должны сказать CONSTANT() => 'value' (или просто использовать запятую вместо большой стрелки) вместо CONSTANT => 'value'.

СМОТРИТЕ ТАКЖЕ

Readonly - средство создания неизменяемых скаляров, массивов, хешей.

Attribute::Constant - создание неизменяемых переменных через атрибуты

Scalar::Readonly - расширение Perl для флага SvREADONLY скаляра

Hash::Util - набор подпрограмм общего использования для хешей (в основном для блокировки/разблокировки ключей и значений)

ОШИБКИ

Пожалуйста, сообщайте об ошибках или предложениях новых функций с помощью утилиты perlbug(1).

АВТОРЫ

Том Феникс, <rootbeer@redcat.com>, при помощи многих других людей.

Добавление нескольких объявленных констант одновременно добавлено Кейси Вестом, <casey@geeknest.com>.

Документация в основном переписана Илмари Кароненом, <perl@itz.pp.sci.fi>.

Эта программа поддерживается разработчиками Perl 5. Дистрибутив CPAN поддерживается Себастьеном Апергисом-Трамони <sebastien@aperghis.net>.

АВТОРСКИЕ ПРАВА И ЛИЦЕНЗИЯ

Авторские права (C) 1997, 1999 Том Феникс

Этот модуль является свободной программой; вы можете распространять его или изменять его в соответствии с теми же условиями, что и Perl сам.

© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/constant

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API