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脚本来说,这可能很棘手
此外,您还提到,您将在循环中调用此脚本。一个好的策略是不要在循环内立即调用脚本,而是构建一个参数队列,然后在循环后的单个执行中将所有参数传递给脚本。脚本将设置其环境,然后在参数上循环执行简单的工作,而无需为每个参数重复设置步骤。否。不是直接设置的,但可以通过多种方式实现
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。