Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Как включить один сценарий в другой?


Автор: ilya_evseev 9.12.2005, 21:31
Создаю "библиотеку":
Код
# this is test.inc
use constant STR1 => 'This is string 1';

И читаю её так:
Код
#!/usr/bin/perl

use strict;
use warnings;

use constant INC_FILE => 'test.inc';

my $return = do INC_FILE;

unless ($return) {
    warn "couldn't parse ".INC_FILE.": $@" if $@;
    warn "couldn't do "   .INC_FILE.": $!" unless defined $return;
    warn "couldn't run "  .INC_FILE unless $return;
    return 0;
}

print "Str1 = ".STR1."\n";

Результат: ругается в самой последней строке на STR1; вообще не видит во внешнем сценарии ни переменных, ни функций из test.inc.

Вариант с вызовом препроцессора ключом -P работает, но он не годится - на той машине не будет препроцессора.

Вариант с модулем отложен на крайний случай, как наиболее монстроидальный.

Автор: korob2001 10.12.2005, 03:53
А зачем тебе нужны константы?

Код

$STR1 = "This is string 1";


Код

#!/usr/bin/perl
use strict 'subs', 'refs';
do ("test.inc");
print "Str1 = $STR1\n";

Автор: sharq 10.12.2005, 12:59
ilya_evseev какая необходимость объявлять конмтанты в стороннем файле?
Если тебе нужно с помощью констант настраивать скрипт, то используй другие методы, например, ini-файл или файл твоей произвольной структуры.

smile

Автор: ilya_evseev 15.12.2005, 01:21
Мне нужны не только константы, а константы, глобальные переменные и функции. Был большой сценарий, делавший одну задачу - обработку данных. Теперь нужен генератор отчёта. Понятно, что можно вынести общий код в модуль, или дописать код в существующий сценарий и сделать разбор командной строки, чтобы вызывать первый или второй кусок. Но мне хотелось сделать нечто, аналогичное #include "file.c" без сишного препроцессора на рабочем сервере (тем более, что perl требует не cpp, а gcc - представляю, сколько там автоматом установится лишнего).

В итоге: пример от Korob2001 работает только для переменных, и только при частично отключённых предупреждениях (если запускать perl с ключом -w, то он свалится). Функции не видны, константы тоже.

<offtopic>Общее замечание: по-моему (мелкие утилиты, типа HyperStat или MicroBackup, пишу на нём с 98 года), Perl своей избыточной сложностью перевешивает свои же преимущества.</offtopic>

Автор: Kannabismus 15.12.2005, 14:27
Const.pm
Код

package Const;

use strict;

use vars qw(@ISA @EXPORT);
@ISA = qw(Exporter);
use Exporter;
@EXPORT = qw/STR1
/;

use constant STR1 => 'This is string 1';

1;

my.pl
Код

use strict;
use lib '.';
use Const;

print "Str1 = " . STR1 ;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)