Я согласен с тем, что использование модуля ini-parsing, как упомянуто, является предпочтительным. Тем не менее, возможно, следующий будет полезно:
use strict;
use warnings;
use Data::Dumper;
my ($block, %hash);
while (<DATA>) {
$block = $1 if /\[(.+)\]/;
$hash{$block}{$1} = $2 if /(\S+?)\s*=\s*(\S+)/ and defined $block;
}
print Dumper \%hash;
__DATA__
[strings]
variables=BUILDID,MAJOR
[BUILDID]
VALUE=898
VERSION.H=/home/src/gd_version.h
readme=/home/src/readm.txt
[MAJOR]
VALUE=8
IGD2.H=/home/src/igd2.h
readme=/home/src/readm.txt
license=/usr/src/license.html
Выход:
$VAR1 = {
'BUILDID' => {
'VERSION.H' => '/home/src/gd_version.h',
'VALUE' => '898',
'readme' => '/home/src/readm.txt'
},
'MAJOR' => {
'VALUE' => '8',
'readme' => '/home/src/readm.txt',
'license' => '/usr/src/license.html',
'IGD2.H' => '/home/src/igd2.h'
},
'strings' => {
'variables' => 'BUILDID,MAJOR'
}
};
Для доступа отдельных значений, используйте следующий шаблон:
my $value = $hash{'block'}{'key'};
Например:
print $hash{'BUILDID'}{'VERSION.H'};
Выход:
/home/src/gd_version.h
В случае, если вы хотели бы попробовать другой INI модуль, Config::IniFiles создаст тот же НОН, как описано выше:
use strict;
use warnings;
use Config::IniFiles;
tie my %hash, 'Config::IniFiles', (-file => 'config.ini');
print $hash{'BUILDID'}{'VERSION.H'};
Выход:
/home/src/gd_version.h
Если вы не знаете, содержимое файла ini, но все же хотите получить доступ к значениям, вы можете сделать следующее - с учетом HoH сверху:
for my $block (keys %hash) {
print "$block:\n";
for my $key (keys %{ $hash{$block} }) {
print "$key => $hash{$block}{$key}\n";
}
print "\n";
}
Выход:
BUILDID:
VERSION.H => /home/src/gd_version.h
VALUE => 898
readme => /home/src/readm.txt
MAJOR:
VALUE => 8
readme => /home/src/readm.txt
license => /usr/src/license.html
IGD2.H => /home/src/igd2.h
strings:
variables => BUILDID,MAJOR
Вместо того, чтобы использовать привязанную хэш, вы можете использовать Config::IniFiles «s методы для доступа к данным:
use strict;
use warnings;
use Config::IniFiles;
my $cfg = Config::IniFiles->new(-file => 'File.txt');
my @sections = $cfg->Sections;
for my $section (@sections) {
print $section, "\n";
my @parms = $cfg->Parameters($section);
for my $param (@parms) {
print "$param => ", $cfg->val($section, $param), "\n";
}
print "\n";
}
Выход:
strings
variables => BUILDID,MAJOR
BUILDID
VALUE => 898
VERSION.H => /home/src/gd_version.h
readme => /home/src/readm.txt
MAJOR
VALUE => 8
IGD2.H => /home/src/igd2.h
readme => /home/src/readm.txt
license => /usr/src/license.html
hillu: это основная задача - выполнить мою другую работу. Вот почему я не смог использовать Ini и Simple modules. – user3237127
hillu: от вашего кода h ow, чтобы получить значение {varilable} -> {major} -> {value} и version.h и пути файла readme – user3237127