powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PERL] Добраться до кода скрипта из модуля
4 сообщений из 4, страница 1 из 1
[PERL] Добраться до кода скрипта из модуля
    #38059981
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть довольно большой модуль (pm-файл), обслуживающий типовые скрипты (pl-файлы).
Есть некоторая специфика использования: модуль выгружает часть своего кода во внешний временный pl-файл, копирует этот файл на удаленный хост, запускает его по SSH и результат выполнения обрабатывает. Чтобы не запутаться в описании, применяю следующую терминологию:
модуль — pm-файл, который содержим общие методы и используется внешними скриптами

скрипт — pl-файл, выполняющий определенные процедуры, который использует модуль

агент — pl-файл, сформированный из модуля и повторяющий часть его функциональности для выполненя на удаленной машине
Хочется добиться следующего:

1. Сейчас временный файл (назовем его агентом) формируется из секции DATA модуля. При этом в файле есть несколько процедур, повторяющих процедуры модуля; скажем есть процедура модуля _query и процедура агента query, код которых совершенно одинаков. Если я обновляю код процедуры в модуле, то нужно также обновить код агента в секции DATA. Сложностей в этом нет, но этот шаг кажется мне избыточным. Можно ли из модуля получить содержимое кода модуля? Я читал про B::Deparse, но не совсем понял, как его применить.
Когда подобный механизм использовался в отдельном скрипте, то я просто открывал файл $0 и извлекал из него нужные процедуры. Однако в модуле $0 указывает не на файл модуля, а на файл вызывающего модуль скрипта.

2. В скрипте также есть секция DATA, в которой храняться некоторые исходные данные для работы скрипта (в основном там храняться SQL-запросы). Можно ли из модуля добраться до содержимого скрипта, в частности секции DATA? Сейчас скрипты сами передают в модуль это содержимое, но хотелось бы эту часть одинакового кода перенести из скрипта в модуль.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
[PERL] Добраться до кода скрипта из модуля
    #38060222
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще третий вопрос.
Почему может два раза вызываться конструктор?

Код скрипта такой:
Код: php
1.
2.
3.
4.
5.
my $lib = new Pkg::MyLib->new();
$lib->read([<DATA>]);
$lib->host('host1', 'ip'=>'10.1.255.250');
...
$lib->start();



Код модуля такой:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
sub _init()
{
	$local->{'data'} = [];
	while (my $line = <DATA>)
	{
		chomp $line;
		last if ($line eq '__END__');
		push @{$local->{'data'}}, $line;
	}
}

sub new
{
	$REFCOUNT++;
	my $this = shift;
	my %options = @_;
	my $class = ref($this) || $this;
	_init();
	$config->{$_} = $options{$_} foreach (keys %options);
	my $self = {};
	$self->{'CONFIG'} = $config;
	bless $self, $class;
	return $self;
}



new (и _init) почему-то вызываются два раза.
...
Рейтинг: 0 / 0
[PERL] Добраться до кода скрипта из модуля
    #38060591
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Потому что вы их так вызываете. Вы 2 раза new делаете. Это в вашем коде есть. Вот тут:
Код: php
1.
my $lib = new Pkg::MyLib->new();
...
Рейтинг: 0 / 0
[PERL] Добраться до кода скрипта из модуля
    #38060727
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно, взгляд замылился. Спасибо.
А по первым двум вопросам не подскажите? В принципе можно через caller узнать имя модуля, поискать его в @INC, но это как-то сложно.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PERL] Добраться до кода скрипта из модуля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]