Perl:在运行时修改.pm文件中的数据结构



我有一个.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(我希望$vargetDataStructure不是真名(并修改返回的引用。

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,而不是原地更改

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来消除这个问题。

最新更新