我有一个.pm文件,我有一个这样的数据结构:
my $var = {
"xyz" => {
"pqr" => {
"all" => "123",
},
},
"abc" => {
"zzz" => {
"f" => "foo1",
"n" => "foo2",
"g" => "foo3",
},
},
};
sub getDataStructure() {
return $var;
}
Run Code Online (Sandbox Code Playgroud)
这种getDataStructure方法被我系统上的各种程序广泛使用.
我想要的是有一个可以写入更多条目的脚本$var.我们假设这些值是用户输入.
我逐行读取文件中的行,一直持续到我};的$var,现在我想回去一行,并使用print FH $newContent其中FH是我的文件句柄.
我怎么做?我尝试使用该seek功能,但无法找到正确的方法
请注意:这个问题不是关于如何将Perl哈希写入文件.这是一些技巧,它可以修改现有的.pm文件,并将一些新值写入我提到的数据结构中.
这是一个糟糕的主意.我不打算回答它,所有的解决方案都会在你维护的任何无法维护的混乱之上添加一个难以维护的混乱.有更好的方法来改变.pm文件中的私有变量,这种方法通过尝试解析和修改Perl代码而不会使事情变得更糟.
最简单的事情是调用getDataStructure(我希望$var并且getDataStructure不是真名)并修改返回的引用.
my $data = getDataStructure;
$data->{new_thing} = { new => "stuff" };
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因这对你不起作用,因为你有能力重写文件,你应该重写它以将数据放入一个单独的文件,可能是JSON.该JSON文件将更容易更改.
my $data;
sub getDataStructure {
$data ||= loadDataStructure("some_config.json");
return $data;
}
Run Code Online (Sandbox Code Playgroud)
如果您没有单独的文件,可以将JSON放在文件末尾的一个__DATA__部分中,并从特殊DATA文件句柄中读取它.
my $data;
sub getDataStructure {
$data ||= loadDataStructure();
return $data;
}
require JSON;
sub loadDataStructure {
my $json = join '', <DATA>;
return JSON->new->decode($json);
}
1;
__DATA__
"xyz": {
"pqr": ...
}
Run Code Online (Sandbox Code Playgroud)
另一个程序更容易在__DATA__JSON 之后读取所有内容,更改它,然后将其写回__DATA__.
如果由于某种原因,这不起作用,那么$var你可以简单地添加它,而不是改变它.
my $var = {
...blah blah blah...
};
sub getDataStructure() {
return $var;
}
# These lines are added at the end.
$var->{new_thing} = { new => "stuff" };
$var->{another_new_thing} = { other => "stuff" };
1;
Run Code Online (Sandbox Code Playgroud)
这是一个维护噩梦,但是附加到.pm文件的末尾比修改数据结构的中间要容易得多.注意保留最终的真实值,或使用true消除该问题.