Ich finde es oft nützlich, in der Lage zu sein, Code zu programmieren, der beim Verlassen des aktuellen Bereichs ausgeführt werden soll. In meinem vorherigen Leben in TCL hat ein Freund eine Funktion erstellt, die wir Defer nennen.Code bei Bereichsänderung in Perl verschieben
Es aktiviert Code wie: set fp [open "x"] verzögern ("close $ fp");
wurde aufgerufen, als der aktuelle Bereich beendet wurde. Der Hauptvorteil ist, dass es immer aufgerufen wird, egal wie/wo ich den Umfang verlasse.
Also habe ich etwas ähnliches in Perl implementiert, aber es scheint, dass es einen einfacheren Weg geben würde. Kommentare Kritik willkommen.
Die Art und Weise habe ich es in Perl:
- schaffen eine globale, gebunden Variable, die eine Reihe von U-Boote hält ausgeführt werden.
- Immer wenn ich einen Fn planen möchte, der beim Beenden aufgerufen wird, verwende ich local, um das Array zu ändern. Wenn ich den aktuellen Bereich belasse, ändert Perl den globalen Wert auf , da das globale gebunden ist, weiß ich, wann diese Wertänderung passiert und kann die Subs in der Liste aufrufen.
Der eigentliche Code ist unten.
Gibt es einen besseren Weg, dies zu tun? Scheint, dies wäre eine häufig benötigte Fähigkeit.
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";
Es ist eine gute Idee, aber ich beabsichtige, eine bessere Version zu machen Das. Die Implementierung ist ein bisschen umständlich IMHO. –