powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: конструктор и деструктор без инстанса
4 сообщений из 4, страница 1 из 1
Perl: конструктор и деструктор без инстанса
    #39613924
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, можно ли сделать такое?

У меня есть модуль, который используется для хранения промежуточных данных между запусками скрипта.
Структура модуля примерно такая:
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
package Store;
our $debug = 1 unless defined $debug;
our $scope = "$0.json" unless defined $scope;
our $data = {} unless defined $data;

sub _get() { <прочитать данные из файла $scope в переменную $data> }

sub _set() { <сохранить данные из переменной $data в файл $scope> }

sub new() { &_get(); }

sub DESTROY() { &_set(); }

sub data() {
  my $self = shift;
  while (my $arg = shift)
  {
    last unless ($arg);
    unless (ref $arg)
    {
      my $val = shift;
      $Store::data->{$arg} = $val;
      next;
    }
    if (ref($arg) eq 'HASH')
    {
      while (my ($k,$v) = each(%$arg))
      {
        $Store::data->{$k} = $v;
      }
      next;
    }
  }
  return $Store::data;
}

1;



А использую модуль, соответственно, примерно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
use Store;
my $s = Store->new();
...
my $tag = $s->data->{'tag'};
my $ts = $s->data->{'ts'};
print "Tag $tag, last run: $ts\n";
$s->data(ts=>time());



А хотел бы использовать так:
Код: php
1.
2.
3.
4.
5.
6.
use Store;
...
my $tag = $Store::data->{'tag'};
my $ts = $Store::data->{'ts'};
print "Tag $tag, last run: $ts\n";
$Store::data->{'ts'} = time();



Но в этом случае я не знаю, как определить события, когда родительский скрипт запустился и завершил работу.
И если вызов конструктора я еще могу эмулировать (просто вызвать метод new в теле модуля), то как вызвать деструктор я не знаю.
...
Рейтинг: 0 / 0
Perl: конструктор и деструктор без инстанса
    #39613932
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне на ум приходила пара способов, но добиться результата не получилось.

1. Можно поставить обработчик на %SIG и перехватывать завершение скрипта. В принципе это работает, но такой способ мне не нравится и я подозреваю, что тут могут быть сложности, если я перехватываю уже перехваченный сигнал.

2. Можно использовать BEGIN и END. Но хотя это и работает на первый взгляд, я не могу понять логику работы Perl.
Добавляю в модуль такой код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
BEGIN {
        print "***BEGIN\n";
}

END {
        print "***END\n";
}

print "***BODY\n";


А в скрипте пишу так:
Код: php
1.
2.
3.
4.
5.
print "1\n";
use Store;
print "2\n";
print Dumper($Store::data);
print "3\n";


И получаю такой вывод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
***BEGIN
***BODY
1
2
{}
3
***END
Почему BEGIN и даже BODY выводится до 1 (до указания use Store)?
...
Рейтинг: 0 / 0
Perl: конструктор и деструктор без инстанса
    #39613934
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подумал было, что это оптимизация компилятора, и сделал так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
print "1\n";
sub t {
use Store;
print "2\n";
print Dumper($Store::data);
}
print "3\n";
exit;
print "4\n";


Но результат получился еще более непонятным:
Код: plaintext
1.
2.
3.
4.
5.
***BEGIN
***BODY
1
3
***END
То есть, хоть use Store и указано в отдельном блоке, который не выполняется, код из тела модуля все равно сработал.

Не подскажите, как правильно это использовать.
...
Рейтинг: 0 / 0
Perl: конструктор и деструктор без инстанса
    #39614038
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://perldoc.perl.org/perlmod.html#BEGIN,-UNITCHECK,-CHECK,-INIT-and-END
Не сказать, что все логично, но по крайней мере что-то стало ясно.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: конструктор и деструктор без инстанса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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