Perl: постоянный и требует - PullRequest
5 голосов
/ 11 мая 2011

У меня есть файл конфигурации (config.pl) с моими константами:

#!/usr/bin/perl
use strict;
use warnings;
use Net::Domain qw(hostname hostfqdn hostdomain domainname);

use constant URL => "http://".domainname()."/";
use constant CGIBIN => URL."cgi-bin/";
use constant CSS => URL."html/css/";
use constant RESSOURCES => URL."html/ressources/";
...

И я хотел бы использовать эти константы в index.pl, поэтому index.pl начинается с:

#!/usr/bin/perl -w
use strict;
use CGI;
require "config.pl";

как использовать URL, CGI ... в index.pl?
Спасибо,
Bye


EDIT
Я нашел решение:
config.pm

#!/usr/bin/perl
package Config;
use strict;
use warnings;
use Net::Domain qw(hostname hostfqdn hostdomain domainname);

use constant URL => "http://".domainname()."/";
use constant CGIBIN => URL."cgi-bin/";
1;

index.pl

BEGIN {
    require "config.pm";
}
print Config::URL;

Конец

Ответы [ 4 ]

3 голосов
/ 11 мая 2011

Здесь вы хотите настроить модуль Perl, из которого вы можете экспортировать.

Поместите в MyConfig.pm следующее:

#!/usr/bin/perl
package MyConfig;
use strict;
use warnings;
use Net::Domain qw(hostname hostfqdn hostdomain domainname);

use constant URL => "http://".domainname()."/";
use constant CGIBIN => URL."cgi-bin/";
use constant CSS => URL."html/css/";
use constant RESSOURCES => URL."html/ressources/";

require Exporter;
our @ISA = 'Exporter';
our @EXPORT = qw(hostname hostfqdn hostdomain domainname URL CGIBIN CSS RESSOURCES);

А затем использовать его:

use MyConfig;  # which means BEGIN {require 'MyConfig.pm'; MyConfig->import} 

Установив @ISA в Exporter в пакете MyConfig, вы настраиваете пакет для наследования от Exporter. Exporter предоставляет метод import, который неявно вызывается строкой use MyConfig;. Переменная @EXPORT содержит список имен, которые Exporter должны импортировать по умолчанию. Есть много других опций, доступных в документации Perl и в документации для Exporter

2 голосов
/ 11 мая 2011
BEGIN { require "config.pl"; }

И вы должны вернуть истинное значение в конце требуемого источника. Обычно:

1; 

Хотя на некоторых модулях я сделал:

print "My::Mod included...\n";

как последнее утверждение в файле. И print возвращает true каждый раз, когда печатает один символ.

См. require.


Устранение неполадок

  • Это может быть проблема с каталогом. Файл .pl должен быть в @INC или изменен путем к файлу.

Попробуйте это:

perl -Mconfig.pl -e 1

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

2 голосов
/ 11 мая 2011
BEGIN {
    require "config.pl";
}
print URL;

или

require "config.pl";
print URL();
0 голосов
/ 11 мая 2011

Вы не можете использовать голые слова, когда вы use strict.

Голое слово - это, по сути, имя переменной, без символа ($,@,%,&,*).

Я предлагаю взглянуть на модуль Readonly на CPAN для создания констант.

В прагме use constant происходит множество магических действий, которые могут привести к трудностям в отладке кода, если вы не будете осторожны.

...