Linux 编写持久化perl脚本

Linux 编写持久化perl脚本,linux,perl,bash,unix,Linux,Perl,Bash,Unix,我正在尝试编写一个持久/缓存脚本。代码如下所示: ... Memoize('process_fille'); print process_file($ARGV[0]); ... sub process_file{ my $filename = shift; my ($a, $b, $c) = extract_values_from_file($filename); if (exists $my_hash{$a}{$b}{$c}){ return $my_h

我正在尝试编写一个持久/缓存脚本。代码如下所示:

...
Memoize('process_fille');
print process_file($ARGV[0]);
...
sub process_file{
    my $filename = shift;
    my ($a, $b, $c) = extract_values_from_file($filename);
    if (exists $my_hash{$a}{$b}{$c}){
        return $my_hash{$a}{$b}{$c};
    }
    return $default;
}
它将从循环中的shell脚本调用,如下所示

value=`perl my_script.pl`;
是否有一种方法可以调用此脚本,使其保持其状态。从一个电话到另一个电话。让我们假设初始化“%my\u hash”和从\u文件调用提取\u值\u都是一项昂贵的操作


谢谢

您无法使脚本保持状态。一旦进程存在,任何未写入磁盘的信息就会消失

不过,有几种方法可以实现这一点:

  • 编写一个在网络或unix套接字上侦听的守护程序。守护进程可以填充
    my_hash
    ,并回答从非常简单的
    my_script.pl
    发送的问题。它只需打开与守护进程的连接,发送问题并返回答案

  • 创建高效的查找文件格式。如果您经常需要这些信息,它可能仍然会留在VFS缓存中

  • 设置共享内存区域。第一次启动脚本时,将信息保存在那里,然后在以后重新使用。但是,对于Perl脚本来说,这可能很棘手


如果示例中的%my\u散列在其最终初始化状态中具有中等大小,则可以简单地使用序列化模块之一,如,或在运行之间以预组装的形式保存数据。当文件不存在时生成一个新文件,并在文件存在时从那里重新加载准备好的内容


此外,您还提到,您将在循环中调用此脚本。一个好的策略是不要在循环内立即调用脚本,而是构建一个参数队列,然后在循环后的单个执行中将所有参数传递给脚本。脚本将设置其环境,然后在参数上循环执行简单的工作,而无需为每个参数重复设置步骤。

否。不是直接设置的,但可以通过多种方式实现

1) I understand **extract_values_from_file()** parses given file returning hash.
2) 1 can be made as a script, then dump the parsed hash using **Data::Dumper** into file.
3) When running my_script.pl, ensure that file generated by 2 is later than of the config file. Can achieve this via **make**
3.1) **use** the file generated by 2 to retrieve values.

同样可以通过冻结/解冻来实现,这是一种暗魔法,但您可以在脚本的
\uuuu数据\uuuu
标记后存储状态并将其持久化

use Data::Dumper; # or JSON, YAML, or any other data serializer
package MyPackage;
my $DATA_ptr;
our $state;
INIT {
    $DATA_ptr = tell DATA;
    $state = eval join "", <DATA>;
}

...
manipulate $MyPackage::state in this and other scripts
...

END {
    open DATA, '+<', $0;   # $0 is the name of this script
    seek DATA, $DATA_ptr, 0;
    print DATA Data::Dumper::Dumper($state);
    truncate DATA, tell DATA;  # in case new data is shorter than old data
    close DATA;
}
__DATA__
$VAR1 = {
    'foo' => 123,
    'bar' => 42,
    ...
}
use Data::Dumper;#或JSON、YAML或任何其他数据序列化程序
包我的包;
我的$DATA\u ptr;
我们的国家;
初始化{
$DATA\U ptr=告知数据;
$state=eval join“”;
}
...
在此脚本和其他脚本中操纵$MyPackage::state
...
结束{

打开数据,“+序列化状态-是。在你自己内部重写它-大该死的不!这可能看起来很奇怪,并产生+1或2,但维护起来非常混乱。非常酷,但打印到实际的源代码文件似乎不健康。依我看,这取决于脚本的使用频率。如果只是偶尔运行,请使用序列化脚本技术。如果它不止这些——例如,它是服务于某种关键的可能是实时的相对目的——那么就让它成为一个持久的后台服务器/使用IPC。