【问题标题】:How to read and update a pm file line by line?如何逐行读取和更新 pm 文件?
【发布时间】:2019-02-14 17:59:14
【问题描述】:

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

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

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

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

我们怎样才能做到这一点?期待您的帮助。

【问题讨论】:

  • 您能提供更多信息吗?
  • 我有一个 config.pm 文件,其值为 $SourcePrimUserHost = '10.226.33.233'; $SourcePrimUserPort = '33002'; $SourceGroupsHost = '10.226.33.233'; $SourceGroupsPort = '33002';我从 perl 脚本中读取这个值并在命令 promot 上显示这个(用户可以更改这个值)。我想将更新值存储回 config.pm 文件。我该怎么做?
  • 现在您知道为什么 Perl 程序不是一种好的存储格式了。你应该问是什么。

标签: perl


【解决方案1】:

不是一个好的设计选择。

  1. Perl 模块可以(应该!)以用户可以读取但不能写入的方式安装。
  2. 如果该模块由多个用户或多个 Perl 程序使用,则 conf 将是系统全局的,而不是特定于应用程序的。
  3. 如果同时运行程序的多个实例,则会出现问题。

我建议使用像 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 ...;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 2011-11-02
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多