读取下面的配置文件我可以通过使用数组(通过使用拆分和连接函数)存储“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的
答案 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'
};
如果您对代码的工作方式有任何疑问,请与我们联系。它可能不是您想要的,但它是一个关于如何存储数据的示例的起点。