2010-06-20 6 views
10

Dans mon script, j'ai besoin de charger quelques informations à partir du fichier disque et pendant l'exécution du script l'information peut être changée.Pour garder la consistance du fichier dans le disque et il est dans la copie de mémoire, je dois réécrire l'information sur le disque chaque fois que l'information est changée en mémoire ou périodiquement les écrire sur le disque ou juste les écrire au moment de la sortie du script, qui est la préférée, parce que cela économisera beaucoup d'IO temps et rendra le script réactif.comment exécuter un morceau de code juste avant la sortie du script perl

Donc, tout comme le titre, ma question est perl a un mécanisme qui répondra à mes besoins?

Répondre

9

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.. 
+1

Voir aussi http://stackoverflow.com/questions/1914730 pour un exemple plus court et des liens vers la documentation appropriée. – daxim

+0

On pourrait aussi écrire un gestionnaire '$ SIG {__ DIE __}', pour exécuter du code lors de la fermeture en raison d'une erreur. – Ether

25

Je pense que vous êtes à la recherche END block:

END { 
    # cleanup 
} 

Un bloc de code END est exécuté le plus tard possible, soit après perl a terminé l'exécution du programme et juste avant l'interprète est d'être quitté, même si elle est sortie à la suite d'une fonction die(). (Mais pas si ça se transforme en un autre programme via exec, ou si vous êtes expulsé de l'eau par un signal - vous devez le piéger vous-même (si vous le pouvez).) Vous pouvez avoir plusieurs blocs END dans un fichier exécuter dans l'ordre inverse de la définition; c'est-à-dire: dernier entré, premier sorti (LIFO). Les blocs END ne sont pas exécutés lorsque vous lancez perl avec le commutateur -c ou si la compilation échoue.

Questions connexes