Я часто нахожу полезным иметь возможность планировать выполнение кода после выхода из текущей области. В моей предыдущей жизни в TCL друг создал функцию, которую мы назвали defer.
Включен код вроде:
set fp [открыть "x"]
defer ("close $ fp");
, который был вызван при выходе из текущей области. Основное преимущество заключается в том, что он всегда вызывается независимо от того, как / где я покидаю область действия.
Итак, я реализовал нечто подобное в Perl, но, похоже, есть более простой способ. Комментарии приветствуются.
То, как я это делал в Perl:
- создать глобальную связанную переменную, которая содержит массив подпрограмм для выполнения.
- всякий раз, когда я хочу запланировать вызов fn при выходе, я использую local для изменения массива.
когда я покидаю текущую область видимости, Perl меняет глобальное на предыдущее значение
потому что глобал привязан, я знаю, когда произойдет это изменение значения, и могу вызвать подпрограммы в списке.
Фактический код указан ниже.
Есть ли лучший способ сделать это? Кажется, это была бы необходимая возможность.
use strict;
package tiescalar;
sub TIESCALAR {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub FETCH {
my $self = shift;
return $self->{VAL};
}
sub STORE {
my $self = shift;
my $value = shift;
if (defined($self->{VAL}) && defined($value)) {
foreach my $s (@{$self->{VAL}}) { &$s; }
}
$self->{VAL} = $value;
}
1;
package main;
our $h;
tie($h, 'tiescalar');
$h = [];
printf "1\n";
printf "2\n";
sub main {
printf "3\n";
local $h = [sub{printf "9\n"}];
push(@$h, sub {printf "10\n";});
printf "4\n";
{
local $h = [sub {printf "8\n"; }];
mysub();
printf "7\n";
return;
}
}
sub mysub {
local $h = [sub {printf "6\n"; }];
print "5\n";
}
main();
printf "11\n";