Простой трюк / Способ изменения значения параметра раздела в INI-файле в Perl - PullRequest
0 голосов
/ 30 ноября 2011

Я ищу простой способ / способ изменить значение параметра для раздела в INI-файле в Perl, как вы, возможно, знаете, все параметры в INI-файле имеют одинаковые имена (это его большая проблема), только раздел имя может иметь значение, но я не думаю, что это поможет в моем случае:

Раздел1

param1 = s1value1

param2 = знач1

1009 * Раздел 2 *

param1 = s2value2

param2 = val2

* 1015 Раздел 3 *

param1 = s3value3

param2 = val3

Я хочу изменить значение val2 параметра param2 в Section2 на valN. Любая идея, я посмотрел на модуль на CPAN, но модуль нуждается в модуле и так далее, у меня никогда не было его работы, я думаю, что есть простой способ

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Это выглядит как нестандартный INI-файл, который будет иметь разделы, обозначенные квадратными скобками: [Section Name]. Однако строка, не содержащая знак равенства, является достаточно простой спецификацией.

Итак, подпрограмма, которая ищет раздел и имя ключа и изменяет значение.

sub new_ini_value { 
    my ( $input, $output, $section, $keyname, $new_value ) = @_;
    my $curr_sect = '';
    SEARCH:
    while ( <$input> ) { 
        if ( m/^\s*([^=]*?)\s*$/ ) { 
            $curr_sect = $1;
        }
        elsif ( $curr_sect eq $section )  { 
            my ( $key, $value ) = m/^\s*([^=]*[^\s=])\s*=\s*(.*?\S)\s*$/;
            if ( $key and $key eq $keyname  ) { 
                print $output "$keyname=$new_value\n";
                last SEARCH;
            }
        }
        print $output $_;
    }
    use English qw<$RS>;
    local $RS;
    print $output ( <$input> );
}
0 голосов
/ 30 ноября 2011

Попробуйте использовать Config :: Tiny :

use Config::Tiny;

my $filename = "test.ini";
my $config = Config::Tiny->new();
$config = Config::Tiny->read($filename);
print "Before:\n";
print $config->write_string();

$config->{Section2}->{param2} = 'valN'; 
print "After:\n";
print $config->write_string();

$config->write($filename);

...