Spesso trovo utile essere in grado di pianificare il codice da eseguire all'uscita dall'ambito corrente. Nella mia precedente vita in TCL, un amico ha creato una funzione che abbiamo chiamato differire.Differire codice sulla modifica dell'oscilloscopio in Perl
Abilitato codice come: set fp [open "x"] posticipato ("chiudi $ fp");
che è stato richiamato all'uscita dall'ambito corrente. Il vantaggio principale è che è sempre invocato indipendentemente da come/dove lascio lo scope.
Così ho implementato qualcosa di simile in Perl ma sembra che ci sarebbe stato un modo più semplice. Commenti critici benvenuto.
La modalità utilizzate in Perl:
- creare una variabile globale, legato che contiene una matrice di sottomarini da eseguire.
- ogni volta che voglio programmare un fn da richiamare all'uscita, utilizzo local per cambiare l'array. quando lascio l'ambito corrente, Perl cambia il globale al valore precedente perché il globale è legato, so quando questo cambiamento di valore accade e può richiamare i sottotitoli nella lista.
Il codice reale è di seguito.
C'è un modo migliore per farlo? Sembra che questa sarebbe una capacità comunemente necessaria.
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";
È una buona idea, ma intendo fare una versione migliore di quella. L'implementazione è un po 'ingombrante IMHO. –