如何在perl脚本退出之前运行一段代码

Hai*_*ang 11 perl

在我的脚本中,我需要从磁盘文件中加载一些信息,并且在脚本运行期间可能会更改信息.要保持文件在磁盘中的一致性并且在内存副本中,我需要将信息写回磁盘. info在内存中更改或定期将它们写回磁盘,或者在脚本退出时将其写回,这是首选的,因为它将节省大量IO时间并使脚本响应.

所以就像标题一样,我的问题是perl是否有一些机制可以满足我的需求?

Ama*_*dan 28

我想你正在寻找END阻止:

END {
    # cleanup
}
Run Code Online (Sandbox Code Playgroud)

END代码块尽可能晚地执行,也就是说,在perl完成程序运行之后并且在退出解释器之前,即使它由于die()函数而退出.(但如果它通过exec变成另一个程序,或者被信号吹出水面则不会 - 你必须自己陷阱(如果可以的话).)你可能在文件中有多个END块 - 它们会以与定义相反的顺序执行; 那就是:后进先出(LIFO).使用-c开关运行perl时,或者编译失败时,不会执行END块.


Cos*_*imo 9

根据您的需求,有两种不同的方法可以做到这一点.

  • END解释器关闭时执行该块.有关详细信息,请参阅上一个答案:)
  • DESTROY块/次,当你的对象超出范围时执行.也就是说,如果您想将逻辑嵌入到模块或类中,那么您可以使用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..
Run Code Online (Sandbox Code Playgroud)