linux - perl 中的文件处理(.conf 文件)

标签 linux perl configuration ini gentoo

我需要阅读这个 .conf 文件。此文件不能被任何模块读取,例如 Config::Tiny、Config::INI、Config::Simple 等。

这是 .conf 文件,假设文件名为 conference.conf :

[ConferenceId] #section
1000 #value
2000
3000
4000

[RadioExt]
1000=102 #parameter and value
2000=202
3000=302
4000=402

我想要的是 perl 只读取值而不是部分并将其打印给用户。我还是 perl 的新手。我刚学了一个星期的perl。这种类型的任务使我在读取、写入、附加配置文件方面更难取得任何进展。

我还想要的是 [ConferenceId] 中的值声明为全局值。随着 [ConferenceId] 中的值发生变化,[RadioExt] 中的其他参数也发生变化。例如,

[ConferenceId]
1100 #the values has been changed
2100
3100
4100

[RadioExt]
1100=102 #parameters also changed
2100=202
3100=302
4100=402

谁能帮我解决这个问题?我知道这是一个很大的帮助。但我真的需要这个,这样我就可以了解更多关于读取、写入和附加配置文件的信息。谢谢。

最佳答案

真正的答案是使用 Config::Tiny .

但是,由于这是老师布置的学习练习,我会指出所有 perlfaq5:How do I change, delete, or insert a line in a file, or append to the beginning of a file? .这应该演示所有操作文件的标准方法。

如果它不是一个模块,我建议使用核心库 Tie::File对于这个问题,但这可能不是你老师的本意。

所以我最后的建议是看一下 source for Config::Tiny .它可能超出您的技能范围,但理想情况下,您将能够在类(class)结束时阅读整个文件。而且这个问题不需要复杂的代码。查看其他人如何解决问题通常是最好的学习方法,尤其是当您能够识别哪些是更好的模块时。


更新

Config::Tiny 无法单独解析您的文件,因为它不是严格的 ini 文件格式。您的其中一个部分具有没有键的原始值这一事实不适用于任何标准模块。

以下是如何使用正则表达式解析文件的示例。可能应该通过额外的错误检查来增强以确保键/值对不与数组值混合,但这应该让你开始:

use strict;
use warnings;

my %hash;
my $section;

while (<DATA>) {
    chomp;
    next if /^\s*$/;

    # Begin Section
    if (/^\s*\[(.*)\]\s*$/) {
        $section = $1;

    # Hash Key & Value
    } elsif (/^(.*?)=(.*)/) {
        $hash{$section}{$1} = $2;

    # Array
    } else {
        push @{$hash{$section}}, $_;
    }
}

use Data::Dump;
dd \%hash;

__DATA__
[ConferenceId]
1000
2000
3000
4000

[RadioExt]
1000=102
2000=202
3000=302
4000=402

输出:

{
  ConferenceId => [1000, 2000, 3000, 4000],
  RadioExt     => { 1000 => 102, 2000 => 202, 3000 => 302, 4000 => 402 },
}

关于linux - perl 中的文件处理(.conf 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22853553/

相关文章:

python - 使用 Python 在 dd 镜像中安装分区

perl - 驼鹿:属性值更改时过期的缓存计算结果到期吗?

regex - 在 Perl 中使用正则表达式获取字符串中的多个匹配项

Perl:使用 XML::Twig 插入 XML::Twig 节点

Apache 提供了错误的 SSL-Cert

asp.net - 关于 web.config 的官方、广泛、完整的文档在哪里?

ruby - 跨网站和 gem 客户端处理用户身份验证的最佳方式

linux - 如何在 Linux 环境下的 Tcl 中根据文件存在检查终止应用程序

linux - 在脚本中创建临时文件 : Advantages of mktemp over touch-ing a file?

linux - 如何从 OS X 上的目标文件中删除单个名称