2014-04-04 129 views
0

我需要读取这个.conf文件。这个文件不能被Config :: Tiny,Config :: INI,Config :: Simple等模块读取。perl中的文件处理(.conf文件)

这里是.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 

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

+1

你不知道关于Perl的任何信息,但是您知道所有这些模块都无法读取该文件?你怎么得出这个结论? – TLP

+0

'。这个文件不能被任何模块读取,例如Config :: Tiny,Config :: INI,Config :: Simple等等。为什么? –

+0

因为我从CPAN读取的格式不是这样的。不是吗? –

回答

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

谢谢你。我会尽力的。 –

+0

等一下。我只是注意到,当我阅读文档。它说Config :: Tiny版本是2.20,而我的是2.12。我试图解开最新的文件,但我不能得到“这看起来不像一个tar档案”的错误。这是什么意思? @Miller –

+0

不知道那个错误是什么意思。我建议看看[如何安装CPAN模块](http://www.cpan.org/modules/INSTALL.html)。 – Miller

0

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

你可以试试这个

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

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

这部分我知道。逻辑部分是问题。 –