如何解决可以在更深层次的绑定哈希分配上调用STORE吗?
我正在尝试为具有以下属性的“持久YAML哈希”编写Perl模块:
- 每次访问时,请检查YAML文件是否已更改,如果已更改,请重新加载。
- 哈希中的任何数据更改后,立即保存。
- 不要保存在
UNTIE
上,以便仅读取值时不会更新文件。
我的第一次尝试似乎效果很好:
package YAMLHash;
use v5.24;
use warnings;
use experimental 'signatures';
use YAML::XS qw(DumpFile LoadFile);
use File::stat;
sub refresh($self)
{
if (-f $self->{file}) {
if (stat($self->{file})->mtime > $self->{mtime}) {
$self->{data} = LoadFile($self->{file});
$self->{mtime} = stat($self->{file})->mtime;
}
}
}
sub save($self)
{
DumpFile($self->{file},$self->{data});
$self->{mtime} = stat($self->{file})->mtime;
}
sub TIEHASH($class,@args)
{
my ($filename) = $args[0];
die "No filename specified" unless $filename;
my $self = bless { data=>{},file=>$filename,mtime=>0 },$class;
refresh($self);
return $self;
}
sub FETCH($self,$key = '')
{
refresh($self);
return $self->{data}{$key};
}
sub EXISTS($self,$key)
{
refresh($self);
return exists($self->{data}{$key});
}
sub FIRSTKEY($self)
{
refresh($self);
my @ignore = keys %{$self->{data}}; # reset iterator
return each %{$self->{data}};
}
sub NEXTKEY($self,$lastkey)
{
refresh($self);
return each %{$self->{data}};
}
sub SCALAR($self)
{
return scalar %{$self->{data}};
}
sub STORE($self,$key,$value)
{
refresh($self);
$self->{data}{$key} = $value;
save($self);
}
sub DELETE($self,$key)
{
refresh($self);
delete $self->{data}{$key};
save($self);
}
sub CLEAR($self,$key)
{
$self->{data} = {};
save($self);
}
1;
我尝试如下:
use YAMLHash;
tie my %foo,'YAMLHash','test.yaml';
$foo{hello} = 'world';
$foo{answer} = 42;
$foo{counter}++;
生成的YAML文件如下所示:
---
answer: 42
counter: 1
hello: world
但是后来我将示例代码更改为:
use YAMLHash;
tie my %foo,'test.yaml';
$foo{hello} = 'world';
$foo{answer} = 42;
$foo{counter}++;
$foo{a}{b}{c}{d} = 'e';
结果是:
---
a: {}
answer: 42
counter: 2
hello: world
因此,很明显,创建STORE
时会调用$foo{a}
,而分配$foo{a}{b}{c}{d}
时不会调用。
有什么办法可以做到这一点吗?
解决方法
您还需要同时绑定pdffile = "input.pdf"
doc = fitz.open(pdffile)
page = doc.loadPage() # number of page
pix = page.getPixmap()
output = "output.tif"
pix.writePNG(output)
,%{ $foo{a} }
和%{ $foo{a}{b} }
。
您可以在%{ $foo{a}{b}{c} }
的数据结构中递归绑定哈希和数组。不要忘记对通过TIEHASH
添加到结构中的数据执行相同的操作!
您可能想对数据结构的根节点和非根节点使用其他类。
警告:使用STORE
将使访问速度变慢。
请注意,您也需要绑定标量,而不仅仅是哈希(和数组)。以下所有内容无需调用tie
即可更改哈希元素的值:
- 直接更改标量:
-
STORE
-
++$foo{a};
-
chomp($foo{a});
- ...
-
- 通过别名或引用更改标量:
-
$foo{a} =~ s/x/y/g;
-
my \$x = \$foo{a}; $x = 123;
-
my $r = \$foo{a}; $$r = 123;
-
for ($foo{a}) { $_ = 123; }
- ...
-
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。