Spec-Zone.ru › Perl 5.34

константа

СОДЕРЖАНИЕ

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

ИМЯ

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, соответствующая скалярная константа вставляется непосредственно вместо некоторых вызовов подпрограмм, тем самым экономя накладные расходы вызова подпрограммы. См. "Константные функции" в 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.34.0/constant

Spec-Zone.ru

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