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

时间:2014-04-04 04:25:35

标签: 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

有人可以帮我这个吗?我知道这是一个很大的好处。但我真的需要这个,以便我可以学习更多关于阅读,编写和附加配置文件的知识。感谢。

2 个答案:

答案 0 :(得分:3)

对此的真正答案是使用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 },
}

答案 1 :(得分:0)

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

你可以试试这个

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

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