Как я могу поделиться глобальными значениями между различными пакетами в Perl? - PullRequest
6 голосов
/ 21 января 2010

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

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

Ответы [ 2 ]

8 голосов
/ 21 января 2010

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

Скажем, у вас есть 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";

Если вы не хотите полностью определять имена, используйте вместо этого стандартный модуль Exporter .

Добавьте три строки к 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 константы, используя модуль constant , а затем экспортировать их.

3 голосов
/ 21 января 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...