我经常发现能够安排代码在离开当前范围时执行很有用。在我之前在 TCL 的生活中,一位朋友创建了一个我们称为 defer 的函数。
它启用了如下代码: set fp [open "x"] defer("close $fp");
在当前范围退出时调用它。主要的好处是无论我如何/在哪里离开范围,它总是被调用。
所以我在 Perl 中实现了类似的东西,但似乎有更简单的方法。欢迎评论批评。
我在 Perl 中的做法:
- 创建一个全局绑定变量,其中包含要执行的子数组。
- 每当我想安排在退出时调用 fn 时,我都会使用 local 来更改数组。当我离开当前范围时,Perl 将全局更改为以前的值,因为全局是绑定的,我知道何时发生此值更改并且可以调用列表中的 subs。
实际代码如下。
有一个更好的方法吗?似乎这将是一个普遍需要的能力。
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";