如何逐行读取和更新pm文件?

时间:2013-02-11 06:19:09

标签: perl

在Perl脚本中,我们从pm文件中检索配置详细信息。用户使用脚本的界面更改配置详细信息后,应在pm文件中写回相同的值。

例如,我有以下config.pm文件:

$SourcePrimUserHost = '10.226.33.233';
$SourcePrimUserPort = '33002';
$SourceGroupsHost = '10.226.33.233';
$SourceGroupsPort = '33002';

我正在从Perl脚本中读取这些值。我想将更新的值存储回config.pm文件。

我们怎么做?期待您的帮助。

2 个答案:

答案 0 :(得分:12)

不是一个好的设计选择。

  1. Perl模块可以(应该!)以用户可以阅读但不能写入的方式安装。
  2. 如果该模块由多个用户或多个Perl程序使用,则conf将是系统全局的,而不是特定于应用程序的。
  3. 如果同时运行多个程序实例,则会出现问题。
  4. 我建议使用像YAML这样的数据序列化格式,尽管JSON,Freeze / Thaw和Dumper可能是其他参赛者。此配置最好存储在单独的文件中。

    如果 将数据存储在同一文件中,则可以使用__DATA__令牌。后面的所有内容都可以在代码中作为DATA文件句柄访问,并且不会被perl执行。更新配置时找到此标记也很简单。如果模块被调用Foo::Bar

    my $serialized_stuff = ...;
    my $self_loc = $INC{"Foo/Bar.pm"}; # %INC holds the location for every loaded module.
    my $tempfile = ...;
    open $SELF, "<", $self_loc or die ...;
    open $TEMP, ">", $tempfile or die ...;
    # don't touch anything before __DATA__
    while(<$SELF>) {
      print $TEMP $_;
      last if /^__DATA__$/;
    }
    print $TEMP $serialized_stuff;
    close $TEMP; close $SELF;
    rename $tempfile => $self_loc or die ...;
    

答案 1 :(得分:5)

使用Config::General中许多配置工具之一,例如CPAN。它们易于使用,支持不同的符号,您可以将值写回文本文件。