如何从Perl访问INI文件?
用Perl解析INI文件并将其转换为哈希的最佳方法是什么?从CPAN尝试此模块:如果您喜欢更高级的样式,请尝试。样本: 使用起来非常简单和直接如何从Perl访问INI文件?,perl,config,ini,Perl,Config,Ini,用Perl解析INI文件并将其转换为哈希的最佳方法是什么?从CPAN尝试此模块:如果您喜欢更高级的样式,请尝试。样本: 使用起来非常简单和直接 $Config = Config::Tiny->read( 'file.conf' ); my $one = $Config->{section}->{one}; my $Foo = $Config->{section}->{Foo}; 我更喜欢使用模块。最好的方法是按照其他人的建议使用CPAN中可用的模块。以下仅为您自
$Config = Config::Tiny->read( 'file.conf' );
my $one = $Config->{section}->{one};
my $Foo = $Config->{section}->{Foo};
我更喜欢使用模块。最好的方法是按照其他人的建议使用CPAN中可用的模块。以下仅为您自己的理解,假设您有如下ini文件:
$ more test.ini
[Section1]
s1tag1=s1value1 # some comments
[Section2]
s2tag1=s2value1 # some comments
s2tag2=s2value2
[Section3]
s3tag1=s3value1
只需使用Perl的正则表达式(或字符串方法)+哈希等数据结构,就可以自己解析w/o模块
示例代码:
$ini="test.ini";
open (INI, "$ini") || die "Can't open $ini: $!\n";
while (<INI>) {
chomp;
if (/^\s*\[(\w+)\].*/) {
$section = $1;
}
if (/^\W*(\w+)=?(\w+)\W*(#.*)?$/) {
$keyword = $1;
$value = $2 ;
# put them into hash
$hash{$section} = [ $keyword, $value];
}
}
close (INI);
while( my( $k, $v ) = each( %hash ) ) {
print "$k => " . $hash{$k}->[0]."\n";
print "$k => " . $hash{$k}->[1]."\n";
}
对上述问题吹毛求疵: 从CPAN下载的Tie::Cfg不处理可能包含空格的节和键。在设置节和节中的键的哈希项时,需要通过在“键”周围添加引号(“)来更改。我试图读取的文件是由MS Windows的人员生成的,因此有足够的空间
Config::Tiny,Config::ini文件对格式很挑剔。如果任何一行不是[section]格式或者key=val,它们会抛出一个错误,人们无法访问哈希值,至少在Config::Files中,哈希值是正确填充的。如果有一个ignore error选项,那就太好了。我试图读取的文件中有一些虚假的M4行,我可以通过M4来消除,但这在我试图处理这些文件时是不必要的特定脚本。ini文件编辑的读写功能:
sub iniRead
{
my $ini = $_[0];
my $conf;
open (INI, "$ini") || die "Can't open $ini: $!\n";
while (<INI>) {
chomp;
if (/^\s*\[\s*(.+?)\s*\]\s*$/) {
$section = $1;
}
if ( /^\s*([^=]+?)\s*=\s*(.*?)\s*$/ ) {
$conf->{$section}->{$1} = $2;
}
}
close (INI);
return $conf;
}
sub iniWrite
{
my $ini = $_[0];
my $conf = $_[1];
my $contents = '';
foreach my $section ( sort { (($b eq '_') <=> ($a eq '_')) || ($a cmp $b) } keys %$conf ) {
my $block = $conf->{$section};
$contents .= "\n" if length $contents;
$contents .= "[$section]\n" unless $section eq '_';
foreach my $property ( sort keys %$block ) {
$contents .= "$property=$block->{$property}\n";
}
}
open( CONF,"> $ini" ) or print("not open the file");
print CONF $contents;
close CONF;
}
更改配置属性或添加新的配置属性
编辑
添加了新配置
$conf->{"www"}->{"path"}="/var/www/html";
已将新配置保存到文件
iniWrite("/etc/samba/smb.conf",$conf);
Config::IniFiles是一个非常强大的INI管理器。很好的建议。最好的方法是查看CPAN().:)请注意,此解析器将为每个部分只保留一个键/值对。Perl最佳实践建议不要使用正则表达式读取配置文件,而是使用CPAN中的标准模块…用于ini文件:
config::IniFiles
。为什么要重新发明轮子?可能是开发人员无法安装包,或者无法配置或使用另一个包,或者en将函数用于工作。建议“Perl最佳实践”不要使用tie。
$conf = iniRead("/etc/samba/smb.conf");
$conf->{"global"}->{"workgroup"} = "WORKGROUP";
$conf->{"www"}->{"path"}="/var/www/html";
iniWrite("/etc/samba/smb.conf",$conf);