[英]Perl: Modify data structure in .pm file at runtime
我有一個.pm文件,其中有這樣的數據結構:
my $var = {
"xyz" => {
"pqr" => {
"all" => "123",
},
},
"abc" => {
"zzz" => {
"f" => "foo1",
"n" => "foo2",
"g" => "foo3",
},
},
};
sub getDataStructure() {
return $var;
}
此getDataStructure
方法被系統上的各種程序廣泛使用。
我想要的是一個可以將更多條目寫入$var
的腳本。 讓我們假設這些值是用戶輸入。
我逐行讀取文件,直到得到};
為止};
$var
,現在我想返回一行,並使用print FH $newContent
,其中FH是我的文件句柄。
我怎么做? 我嘗試使用seek
功能,但找不到正確的方法
請注意:此問題與如何將Perl哈希寫入文件無關。 這是一些技巧,可以修改現有的.pm文件並將一些新值寫入我提到的數據結構中。
這是一個可怕的主意。 我不會回答這個問題,所有解決方案只會在您要維護的任何無法維護的混亂之上添加一個無法維護的混亂。 有很多更好的方法來更改.pm文件中的私有變量,這些方法不會通過嘗試解析和更改Perl代碼而使情況變得更糟。
最簡單的方法是調用getDataStructure
(我希望$var
和getDataStructure
不是真實名稱)並修改返回的引用。
my $data = getDataStructure;
$data->{new_thing} = { new => "stuff" };
如果由於某種原因這對您不起作用,因為您有能力重寫文件,則應重寫它以將數據放入單獨的文件中,可能是JSON。 該JSON文件將更容易更改。
my $data;
sub getDataStructure {
$data ||= loadDataStructure("some_config.json");
return $data;
}
如果沒有單獨的文件,則可以將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": ...
}
對於另一個程序而言,將__DATA__
所有內容讀取為JSON,對其進行更改並在__DATA__
之后將其寫回要容易得多。
如果由於某種原因該命令不起作用,則只需在其中添加$var
即可,而無需更改$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;
這是維護方面的噩夢,但是將其附加到.pm文件的末尾比更改數據結構的中間要容易得多。 請注意在最后保留真實值,或者使用true消除該問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.