【问题标题】:File handling (.conf file) in perlperl 中的文件处理(.conf 文件)
【发布时间】:2014-05-16 05:18:48
【问题描述】:

我需要阅读这个 .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

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

【问题讨论】:

  • 您对 Perl 一无所知,但您知道所有这些模块都无法读取该文件?你是怎么得出这个结论的?
  • . This file cannot be read by any module such as Config::Tiny, Config::INI, Config::Simple and etc. 为什么?
  • 因为我从 CPAN 读取格式不是这样的。对不对?
  • 所以您的格式有一个名称,但它与您在所有其他模块的文档中阅读的内容不匹配?你知道,如果这是作业,你应该这样说,你会得到更好的答案。比如米勒已经给出的那个。可以为您描述的一般格式编写解析器,但在任何实际情况下,您宁愿使用已经过测试和调试的现有模块。
  • 我已经使用了 Config::Tiny 但它没有读取我的文件。但我会再试一次。 @TLP

标签: linux perl configuration ini gentoo


【解决方案1】:

对此的真正答案是使用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。它可能超出您的技能范围,但理想情况下,您可以在课程结束时阅读整个文件。而且这个问题不需要复杂的代码。查看其他人如何解决问题可能是最好的学习方式,尤其是当您能够识别出哪些是更好的模块时。


更新

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 },
}

【讨论】:

  • 等等。我只是注意到,当我阅读文档时。它说 Config::Tiny 版本是 2.20,我的是 2.12。我尝试解压缩最新的文件,但我无法收到“这看起来不像 tar 存档”的错误。这是什么意思? @米勒
  • 不知道那个错误是什么意思。我建议看看How to install CPAN modules
  • 我仍然无法使用 Config::Tiny 读取此文件。 @米勒
  • 我已经用一些更明确的代码对这个答案进行了更新,这些代码可能会对您有所帮助。祝你好运。
  • 感谢@Miller 的帮助。对此,我真的非常感激。这种格式对我来说真的很难,因为我对 perl 还是很陌生。多谢,伙计。点赞。
【解决方案2】:

即使文件扩展名为 .conf,您也应该能够像阅读任何其他文本文件一样阅读它。

你可以试试这个

$file = "<yourfilename here>";
open(FH,$file);

while(<FH>)
{
$line = $_;
# here you can write your logic 
}

【讨论】:

  • 这部分我知道。逻辑部分是问题。
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 2023-04-03
  • 2011-08-23
  • 2011-04-15
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
相关资源
最近更新 更多