2011-11-29 37 views
0

我正在寻找一个简单的技巧/方法来修改Perl中INI文件中段的参数值,正如您所知,所有参数在INI文件具有相同的名称(这是它很大的问题),只有部分名称可以赚取差价,但我不认为它会在我的情况有所帮助:一个简单的方法/修改Perl中INI文件中段的参数值的方法

SECTION1

参数1 = s1value1

param2 = val1

Section2

参数1 = s2value2

param2的= val2的

Section3中

参数1 = s3value3

param2的= VAL3

我想改变第2节的参数参数2至VALN的值val2的,任何想法,我在CPAN模块上看,但模块需要模块等,我从来没有工作,我认为有一个简单的方法hein?

+0

你确定这些部分不是'[Section1]'? – Axeman

回答

0

尝试使用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); 

1

这看起来像一个非标准的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>); 
} 
相关问题