gpt4 book ai didi

linux - 编写持久的 perl 脚本

转载 作者:IT王子 更新时间:2023-10-29 00:46:57 27 4
gpt4 key购买 nike

我正在尝试编写持久/缓存脚本。代码看起来像这样:

...
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 都是一个昂贵的操作。

谢谢

最佳答案

这是一种黑魔法,但您可以在脚本的 __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 block 中,存储文件的 __DATA__ 部分的开头位置并反序列化您的状态。在 END block 中,您重新序列化当前状态并覆盖脚本的 __DATA__ 部分。当然,运行脚本的用户需要对脚本有写权限。

编辑为使用 INIT block 而不是 BEGIN block ——DATA block 未在编译阶段设置。

关于linux - 编写持久的 perl 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10352298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com