编写一个持久的perl脚本

我正在尝试编写一个持久性/高速caching的脚本。 代码看起来像这样:

... 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_hash'和调用extract_values_from_file是一个昂贵的操作。

谢谢

Solutions Collecting From Web of "编写一个持久的perl脚本"

如果示例中的%my_hash在最终初始化状态下的大小适中,则可以简单地使用诸如Storable , JSON :: XS或Data :: Dumper之类的序列化模块之一来保持数据在运行之间的预组装形式。 生成一个新的文件,当它不存在时,只需从那里重新加载准备好的内容。

另外,你已经提到你可以在循环中调用这个脚本。 一个好的策略是在循环内不要立即调用脚本,而是建立一个参数队列,然后在单次执行循环之后将所有脚本传递给脚本。 脚本会建立自己的环境,然后循环参数进行简单的工作,而不需要为每个脚本重新设置步骤。

这是一种黑暗的魔法,但你可以在你的脚本的__DATA__标记之后存储状态并保存它。

 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, ... } 

INIT块中,存储文件__DATA__节的开始位置,并反序列化你的状态。 在END块中,重新设置当前状态并覆盖脚本的__DATA__部分。 当然,运行脚本的用户需要具有脚本的写入权限。

编辑使用INIT块而不是BEGIN块 – 在编译阶段没有设置DATA块。

你不能让脚本保持状态。 只要进程存在,任何未写入磁盘的信息都将消失。

有几种方法可以做到这一点:

  • 编写一个监听网络或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. 

冻融也可以达到同样的效果