我需要阅读这个 .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
谁能帮我解决这个问题?我知道这是一个很大的帮助。但我真的需要这个,这样我就可以了解更多关于读取、写入和附加配置文件的信息。谢谢。
最佳答案
真正的答案是使用 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
.它可能超出您的技能范围,但理想情况下,您将能够在类(class)结束时阅读整个文件。而且这个问题不需要复杂的代码。查看其他人如何解决问题通常是最好的学习方法,尤其是当您能够识别哪些是更好的模块时。
更新
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 },
}
关于linux - perl 中的文件处理(.conf 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22853553/