在我的腳本中,我需要從磁盤文件加載一些信息,並且在腳本運行過程中可能會更改信息。爲了保持文件在磁盤中的一致性並且它在內存中的副本,我需要 寫回信息到磁盤每當信息在內存中改變或定期寫他們 回磁盤或者只是把它們寫回腳本退出,這是最好的一個時間,因爲它會節省大量的IO時間並使腳本響應。如何在perl腳本退出之前運行一段代碼
因此,正如標題,我的問題是不Perl有一些機制,滿足我的需求?
在我的腳本中,我需要從磁盤文件加載一些信息,並且在腳本運行過程中可能會更改信息。爲了保持文件在磁盤中的一致性並且它在內存中的副本,我需要 寫回信息到磁盤每當信息在內存中改變或定期寫他們 回磁盤或者只是把它們寫回腳本退出,這是最好的一個時間,因爲它會節省大量的IO時間並使腳本響應。如何在perl腳本退出之前運行一段代碼
因此,正如標題,我的問題是不Perl有一些機制,滿足我的需求?
有兩種不同的方式來做到這一點,取決於你在找什麼。
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..
我認爲你正在尋找END
block:
END {
# cleanup
}
結束代碼塊儘可能晚地執行,也就是說,perl的運行完畢的程序和解釋正在之前之後退出,即使它由於die()函數而退出。 (但是,如果它通過exec變形到另一個程序中,或者被信號吹向水中,則不能 - 如果可以的話,你必須自己去捕捉它。)在文件中你可能有多個END塊 - 它們會按照定義的相反順序執行;即:先進先出(LIFO)。使用-c開關運行perl時,或編譯失敗時,END塊不會執行。
另見http://stackoverflow.com/questions/1914730爲一個簡短的例子,並鏈接到相應的文檔。 – daxim 2010-06-20 13:05:22
也可以編寫'$ SIG {__ DIE __}'處理程序,在由於錯誤而退出時執行代碼。 – Ether 2010-06-20 15:59:13