2010-06-20 149 views
10

在我的腳本中,我需要從磁盤文件加載一些信息,並且在腳本運行過程中可能會更改信息。爲了保持文件在磁盤中的一致性並且它在內存中的副本,我需要 寫回信息到磁盤每當信息在內存中改變或定期寫他們 回磁盤或者只是把它們寫回腳本退出,這是最好的一個時間,因爲它會節省大量的IO時間並使腳本響應。如何在perl腳本退出之前運行一段代碼

因此,正如標題,我的問題是不Perl有一些機制,滿足我的需求?

回答

9

有兩種不同的方式來做到這一點,取決於你在找什麼。

  • END塊在解釋器關閉時執行。有關更多詳細信息,請參閱上一個答案:)
  • DESTROY block/sub,在對象超出範圍時執行。也就是說,如果你想將你的邏輯嵌入到模塊或類中,那麼你可以使用DESTROY

看看下面的例子(這是一個工作的例子,但像錯誤檢查等一些細節..省略):

#!/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

另見http://stackoverflow.com/questions/1914730爲一個簡短的例子,並鏈接到相應的文檔。 – daxim 2010-06-20 13:05:22

+0

也可以編寫'$ SIG {__ DIE __}'處理程序,在由於錯誤而退出時執行代碼。 – Ether 2010-06-20 15:59:13

25

我認爲你正在尋找END block

END { 
    # cleanup 
} 

結束代碼塊儘可能晚地執行,也就是說,perl的運行完畢的程序和解釋正在之前之後退出,即使它由於die()函數而退出。 (但是,如果它通過exec變形到另一個程序中,或者被信號吹向水中,則不能 - 如果可以的話,你必須自己去捕捉它。)在文件中你可能有多個END塊 - 它們會按照定義的相反順序執行;即:先進先出(LIFO)。使用-c開關運行perl時,或編譯失敗時,END塊不會執行。

相關問題