Как я могу совместно использовать глобальные значения среди различных пакетов в Perl?

Существует ли стандартный способ кодировать модуль для содержания глобальных параметров приложения, которые будут включены в любой пакет? Например: use Config;?

Простой пакет, который только содержит our переменные? Что относительно переменных только для чтения?

6
задан brian d foy 21 January 2010 в 17:52
поделиться

2 ответа

Уже установлен стандартный модуль конфигурации , поэтому выберите другое имя.

Скажем, у вас есть myconfig.pm со следующим содержимым:

package MyConfig;

our $Foo = "bar";

our %Baz = (quux => "potrzebie");

1;

Тогда другие модули могут использовать его как в

#! /usr/bin/perl

use warnings;
use strict;

use MyConfig;

print "Foo = $MyConfig::Foo\n";

print $MyConfig::Baz{quux}, "\n";

, если вы не хотите полностью квалифицировать имена, то используйте стандарт Экспортер модуль вместо этого.

Добавьте три строки на myconfig.pm :

package MyConfig;

require Exporter;
our @ISA = qw/ Exporter /;
our @EXPORT = qw/ $Foo %Baz /;

our $Foo = "bar";

our %Baz = (quux => "potrzebie");

1;

Теперь полное имя пакета больше не нужно:

#! /usr/bin/perl

use warnings;
use strict;

use MyConfig;

print "Foo = $Foo\n";

print $Baz{quux}, "\n";

Вы можете добавить скалярный только для чтения на myconfig.pm с

our $READONLY;
*READONLY = \42;

это задокументировано в Perlmod .

После добавления его в @MyConfig :: Export , вы можете попробовать

$READONLY = 3;

в другом модуле, но вы получите

Modification of a read-only value attempted at ./program line 12.

как альтернативу, вы могли бы объявить в MyConfig .PM Константы с использованием постоянной модуля , а затем экспортируют те.

8
ответ дан 9 December 2019 в 22:34
поделиться

Не используйте глобальные переменные для конфигурации и не конфигурация SOTRE в качестве кода. У меня целая глава в овладении Perl об этом.

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

Интерфейс конфигурации также дает вам преимущество в составе новых ответов на вопросы настройки, объединяя правильные биты фактических данных конфигурации. Вы скрываете все это за методом, а более высокие уровни не должны видеть, как это реализовано. Например,

 print "Hello!" unless $config->be_silent;

Ответ Be_silent может быть запускается по нескольким причинам, о котором не нужно знать код более высокого уровня. Это может быть из пользовательского переключателя, что программа обнаружена, что она не интерактивна и так далее. Он также может быть перевернут опциями, такими как отладочный коммутатор, который переопределяет все остальные предпочтения. Независимо от того, что вы решите, эта строчка кода не меняется, потому что это утверждение только заботится об ответе, а не как вы получили ответ.

3
ответ дан 9 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: