从perl中的配置文件中读取文件的值和路径

时间:2014-01-25 16:54:54

标签: arrays perl

读取下面的配置文件我可以通过使用数组(通过使用拆分和连接函数)存储“info”的值,并能够检查每个数组值的总值,但是我在阅读时看到了每个信息值下的文件。

[abc]
Info=alerts,requestes
[alerts]
total=23
/home/value/date/readme.txt
/root/File1
/home/File2
/users/cord/File3
[requestes]
Total=87
C:\user\user1\file1
C:\user\user1\file2
C:\user\user1\file3

你对此有什么想法吗?我们怎样才能通过使用perl来实现这个目标。 我的预期输出是这样的     提醒文件     /home/value/date/readme.txt     / root / File1 / home / File2     /用户/线/文件3     请求文件     C:\用户\ USER1 \文件1     C:\用户\ USER1 \文件2     C:\用户\ USER1 \ file3的

1 个答案:

答案 0 :(得分:-1)

我认为您不需要CPAN的模块来执行此操作,但它可能会有所帮助。我写了一些代码,希望能让你开始这个。

有很多方法可以做到这一点,但一种方法是只读入文件,并将其解析为哈希,同时使用正则表达式来确定哪一行包含哪些数据或内容。

#!/bin/perl
use strict;
use warnings;


my $file = <<'EOD';
[abc]
Info=alerts,requests
[alerts]
total=23
/home/value/date/readme.txt
/root/File1
/home/File2
/users/cord/File3
[requests]
Total=87
C:\user\user1\file1
C:\user\user1\file2
C:\user\user1\file3
EOD

my %info_hash;

my @file_contents = split('\n', $file);


my $title = shift @file_contents;
$title =~ s/\[(.*)\]/$1/g;

print "Title: $title\n";
my $info_string = shift @file_contents;
$info_string =~ s/^.*?=//;
my @info = split(',', $info_string);

my $key;

for my $line (@file_contents) {

    chomp $line;
    if ( $line =~ /^\[(.*?)\]/ ) {
        $key = $1;
    } elsif ( $line =~ /^total=(.*)/i ){
        $info_hash{$key}{total} = $1;
    } else {
        push @{$info_hash{$key}{values}}, $line;
    }
}

for my $entry (keys %info_hash) {
    print "Total for $entry is " . $info_hash{$entry}{total} . "\n";
    print join(" ", @{$info_hash{$entry}{values}}) . "\n";
}

该程序将其解析为散列哈希。结构如下所示:

%info_hash =
'alerts' =>
{
      'values' => [
                    '/home/value/date/readme.txt',
                    '/root/File1',
                    '/home/File2',
                    '/users/cord/File3'
                  ],
      'total' => '23'
};
'requests' =>
{
      'values' => [
                    'C:\\user\\user1\\file1',
                    'C:\\user\\user1\\file2',
                    'C:\\user\\user1\\file3'
                  ],
      'total' => '87'
};

如果您对代码的工作方式有任何疑问,请与我们联系。它可能不是您想要的,但它是一个关于如何存储数据的示例的起点。