Il existe deux façons de procéder, selon ce que vous recherchez.
- Le bloc
END
est exécuté lorsque l'interpréteur est arrêté. Voir la réponse précédente pour plus de détails :)
- Le bloc
DESTROY
, qui est exécuté lorsque votre objet est hors de portée. Autrement dit, si vous voulez intégrer votre logique dans un module ou une classe, vous pouvez utiliser DESTROY
.
Jetez un oeil à l'exemple suivant (il est un exemple de travail, mais certains détails comme la vérification des erreurs, etc .. sont omis):
#!/usr/bin/env perl
package File::Persistent;
use strict;
use warnings;
use File::Slurp;
sub new {
my ($class, $opt) = @_;
$opt ||= {};
my $filename = $opt->{filename} || "./tmpfile";
my $self = {
_filename => $filename,
_content => "",
};
# Read in existing content
if (-s $filename) {
$self->{_content} = File::Slurp::read_file($filename);
}
bless $self, $class;
}
sub filename {
my ($self) = @_;
return $self->{_filename};
}
sub write {
my ($self, @lines) = @_;
$self->{_content} .= join("\n", @lines);
return;
}
sub DESTROY {
my ($self) = @_;
open my $file_handle, '>', $self->filename
or die "Couldn't save persistent storage: $!";
print $file_handle $self->{_content};
close $file_handle;
}
# Your script starts here...
package main;
my $file = File::Persistent->new();
$file->write("Some content\n");
# Time passes...
$file->write("Something else\n");
# Time passes...
$file->write("I should be done now\n");
# File will be written to only here..
Voir aussi http://stackoverflow.com/questions/1914730 pour un exemple plus court et des liens vers la documentation appropriée. – daxim
On pourrait aussi écrire un gestionnaire '$ SIG {__ DIE __}', pour exécuter du code lors de la fermeture en raison d'une erreur. – Ether