代码之家  ›  专栏  ›  技术社区  ›  d.Grudder

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

  •  0
  • d.Grudder  · 技术社区  · 10 年前

    我需要阅读这个.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。这种类型的任务使我更难在读取、写入和附加配置文件方面取得任何进展。

    我还希望 [会议ID] 声明为全局。作为 [会议ID] 已更改,中的其他参数 [无线电分机] 也发生了变化。例如

    [ConferenceId]
    1100 #the values has been changed
    2100
    3100
    4100
    
    [RadioExt]
    1100=102 #parameters also changed
    2100=202
    3100=302
    4100=402
    

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

    2 回复  |  直到 10 年前
        1
  •  3
  •   Miller    10 年前

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

    然而,由于这是老师布置的学习练习,我将向您指出以下所有问题: 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 。这可能超出了您的技能范围,但理想情况下,您可以在课程结束时阅读整个文件。这个问题不需要复杂的代码。看看别人是如何解决问题的,这可能是最好的学习方法之一,尤其是如果你能够识别出哪些模块更好。


    使现代化

    配置::微型 单独无法解析文件,因为它不是严格的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 },
    }
    
        2
  •  0
  •   Jaison    10 年前

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

    你可以试试这个

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