Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Nickola

Страницы: [1]
1
Есть основной скрипт:

use strict;
BEGIN { require \'./modules.pl\'; }

if (\'a\' > 1) { print "Warnings Test"; }
my $t = \'Тест\';
print "W: $t\\n";
$t =~ s/т/1/gi;
print "W: $t\\n";

и файл, который должен подгружать модули - \'modules.pl\':

require 5.004;
use strict;
use warnings; use diagnostics;

use locale;
use POSIX qw(locale_h);
setlocale(LC_CTYPE,"ru_RU.CP1251");


При этом \'use warnings; use diagnostics;\' пробрасывается в основной скрипт, а вот \'use locale;\' нет.
В чем проблема?
Как добиться чтобы

use locale;
use POSIX qw(locale_h);
setlocale(LC_CTYPE,"ru_RU.CP1251");

пробрасывался в основной скрипт?

2
Подскажите пожалуйста, как граматно реализовать следующее:
Пишу движек сайта, нужен конфиг в котором описаны переменные, нужен default-конфиг в котором описаны "константы".
Переменные конфига и "константы" частично рассчитываются динамически - т.е. 1 раз при загрузке
соответствующего конфига.

Основной движек должен в начале загрузить конфиг, конфиг должен загрузить default-конфиг.
Переменные конфига и "константы" должны быть доступны движку.

Далее, движек должен загрузить и проинициализировать основные библиотеки/модули и обеспечить работу с ними.
По необходимости движек должен подгружать модули для расширения функциональности если это нужно (работа с БД).

Посмотрел много OpenSource решений, сделал вариант приведенный ниже.
Посоветуйте как его оптимизировать?

Сделал такой вариант (мне кажется это плохой вариантом):

Конфиг - \'engine_config.pl\', в нем:
(из него переменные доступны как \'$ENGINE::VAR_NAME\')

{
package ENGINE;

$DIR_SITE_ENGINE = \'/dir/...\';
$DIR_SITE_ENGINE = \'/dir/...\';


$DB_HOST = \'www.host.com\';
# и так далее
}
require \'engine_def_config.pl\';


Default-конфиг - \'engine_def_config.pl\', в нем:
(его переменные подгружаются в тот же userspace)

{
package ENGINE;

$DEF_VAR1 = \'value1\';
$DEF_VAR2 = \'value2\';
# и так далее
}


Загрузчик модулей \'engine.pm\', в нем:

package ENGINE;
use Exporter;

use strict;
use lib $ENGINE::DIR_SITE_ENGINE_LIB;
use lib $ENGINE::DIR_SITE_ENGINE_LIB_OTHER;
require $ENGINE::DIR_SITE_ENGINE_LIB.\'engine_config.pl\';

use Carp qw(longmess);

# Modules checks
$CT::HANDLE_LOGGER = undef;
eval { require ENGINE::Logger; };
if ($@) { print "No Logger"; }
else { $CT::HANDLE_LOGGER = ENGINE::Logger->new(); }

# Logger
sub LOG {
$ENGINE::HANDLE_LOGGER->add(@_) if ($ENGINE::HANDLE_LOGGER);
}
# и так далее



В основном движке:

require \'..../lib/engine_config.pl\';
use strict;
use lib $ENGINE::DIR_SITE_ENGINE_LIB;
use lib $ENGINE::DIR_SITE_ENGINE_LIB_OTHER;

use ENGINE; # That module will load all needed...
&ENGINE::LOG(\'info\', \'Testing 1\');


Хочется оптимизировать следующее:
 - не хочеся в каждом модуле писать \'use lib $ENGINE::DIR_SITE_ENGINE_LIB;\',
   хетелось бы 1 раз это cдеалть чтобы все модули знали.
 - не хочеся в каждом модуле писать require \'..../lib/engine_config.pl\',
   хетелось бы 1 раз это cдеалть чтобы все модули знали.
 - надо чтобы движек мог при необходимости подгружать модули (например для работы с БД), не хочется во всех
   таких модулях делать \'use lib $ENGINE::DIR_SITE_ENGINE_LIB;\' и \'require \'..../lib/engine_config.pl\'\'
 - кстати \'require \'..../lib/engine_config.pl\'\' в кадом модуле заново дергает \'engine_config.pl\' и
   рассчитывает в нем переменные заново или это всетаки делается 1 раз?

 - хочется граматно подгружать необходимые модули чтобы они были доступны из движка,
   т.е. делать типа "requre \'module.pm\'" для модулей вида:

package ENGINE;
use Exporter;

use strict;
use lib $ENGINE::DIR_SITE_ENGINE_LIB;
use lib $ENGINE::DIR_SITE_ENGINE_LIB_OTHER;
require $ENGINE::DIR_SITE_ENGINE_LIB.\'engine_config.pl\';

use Carp qw(longmess);

# Modules checks
$CT::HANDLE_DB = undef;
eval { require ENGINE::DB; };
if ($@) { die "No DB"; }
else { $CT::HANDLE_DB = ENGINE::DB->new(); }

sub DB_OPEN {
...
}

Вызов функций такого модуля будет через:
ENGINE::DB_OPEN(...);

3
Perl / Проблема при получении вывода STDERR (+)
« : 16 Октября 2006, 11:40:38 »
Цитировать
Nickola:
Не подскажите, а можно ли при этом получить "error code", который вернула запускаемая программа?


Нашел - "$?".

4
Perl / Проблема при получении вывода STDERR (+)
« : 16 Октября 2006, 11:34:24 »
Цитировать
arto:
# perl -de0
...
DB<1> open F,"date 12121212 2>&1 |"

DB<2> @a =

DB<3> p @a
date: cannot set date: Operation not permitted
Tue Dec 12 12:12:00 EET 2006

DB<4>


Не подскажите, а можно ли при этом получить "error code", который вернула запускаемая программа?

5
Perl / Проблема при получении вывода STDERR (+)
« : 16 Октября 2006, 11:23:21 »
Цитировать
arto:
# perl -de0
...
DB<1> open F,"date 12121212 2>&1 |"

DB<2> @a =

DB<3> p @a
date: cannot set date: Operation not permitted
Tue Dec 12 12:12:00 EET 2006

DB<4>


Я думал что "2>&1" в Windows рабоать не будет, оказалось рабоает.
Спасибо.

6
Perl / Проблема при получении вывода STDERR (+)
« : 16 Октября 2006, 11:02:03 »
Цитировать
arto:
perldoc -f open

Что-то я не нашел там решения, пробовал сделать:

$| = 1; # make unbuffered


Но это не решило проблему...

7
Perl / Проблема при получении вывода STDERR (+)
« : 13 Октября 2006, 20:29:46 »
Мне нужно получить то, что выводит в STDERR запускаемое через system() приложение.
Делаю так:

local *OLD;
open OLD, \'>&STDERR\';
close(STDERR);
if (!open (STDERR, \'>err.txt\')) { die "Unable to open STDERR"; }

my $c ="perl -e \\" print STDERR \'ERR\';\\"";
my $res = system($c);

open(STDERR,\'>&OLD\');

После выполнения скрипта в файле \'err.txt\' вижу \'ERR\' - т.е. все работает как надо.

Но мне надо этот вывод получить в переменную, делаю так:

local *OLD;
open OLD, \'>&STDERR\';
close(STDERR);

open (STDERR, \'>\', \\$output) || &die_error("Unable to open STDERR");

my $c ="perl -e \\" print STDERR \'ERR\';\\"";
my $res = system($c);

open(STDERR,\'>&OLD\');

print "OUT: ".$output;

После выполнения скрипта вижу: "OUT: ", т.е. STDERR не попал в переменную $output.

Подскажите, в чем проблема?

Thanx!

Страницы: [1]