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

时间:2015-08-10 19:57:45

标签: perl

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

1 个答案:

答案 0 :(得分:6)

这是一个糟糕的主意。我不打算回答它,所有的解决方案都会在你维护的任何无法维护的混乱之上添加一个难以维护的混乱。有更好的方法来改变.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;

+-----+-------------------+
| num | bytes as hex      |
+-----+-------------------+
|   0 | 00 00 00 00 00 00 |
|   1 | 80 7b 14 ae 47 61 |
|   2 | 80 20 d0 91 7b 14 |
|   3 | 80 20 d0 92 5c d0 |
|   4 | 80 20 d0 92 7b 14 |
|   5 | 80 20 d0 93 5c d0 |
|   6 | 80 20 d0 93 d0 bb |
|   7 | 80 20 d0 93 7a 14 |
|   8 | 80 20 d0 93 09 e2 |
|   9 | 80 20 d0 94 d1 9b |
|  10 | 80 20 d0 94 14 d0 |
|  16 | 84 48 e1 7a 14 7e |
|  20 | 85 0a d7 a3 70 1d |
|  32 | 86 ec 51 b8 1e 20 |
|  48 | 86 86 eb 51 b8 40 |
|  73 | 87 00 00 00 00 12 |
| 100 | 87 00 00 00 00 48 |
| 130 | 88 00 00 00 80 01 |
+-----+-------------------+

这是一个维护噩梦,但是它更容易追加到.pm文件的末尾,而不是改变数据结构的中间位置。注意保留最终的真实价值,或使用true消除该问题。