【问题标题】:Perl: Modify data structure in .pm file at runtimePerl:在运行时修改 .pm 文件中的数据结构
【发布时间】:2015-11-02 20:52:35
【问题描述】:

我有一个 .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 文件并将一些新值写入我提到的数据结构中。

【问题讨论】:

  • 我建议您使用 JSON 格式并将哈希序列化为文件。见How to convert a simple hash to json in Perl?
  • 另外,你知道这是一个非常糟糕的主意,对吧?
  • 这是个坏主意,也许你应该谈谈你想用它解决的问题。我们也许可以想出更好的东西。
  • 你的意思是你的脚本只能访问自己,而不能访问文件系统的其余部分或数据库?

标签: perl


【解决方案1】:

这是一个糟糕的主意。我不会费心回答它,所有的解决方案只会在你正在维护的任何无法维护的混乱之上添加一个无法维护的混乱。有很多更好的方法可以更改 .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__ section 中,然后从特殊的 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 消除该问题。

【讨论】:

  • 这对我来说更容易。感谢您的回答。是的,$var 和 getDataStructure 不是实际名称 :)
  • 真正的问题是没有改变 .pm 文件中的私有变量。相反,其他用户可以拥有一个外部脚本来操作这个 .pm 并添加新条目。我知道我正在处理的一团糟,但我目前也没有任何选择。
  • @KedarJoshi 将数据移动到一个更易于操作的 JSON 文件中似乎可以解决这个问题。有什么你没有告诉我们的吗?
  • 是的,JSON 解决方案确实适合我。我将有一个单独的 JSON 格式文件来存储我的数据,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 2019-02-06
  • 2020-12-25
相关资源
最近更新 更多