2011-11-29 38 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>); 
} 
相關問題