在 Perl 中修改 INI 文件中某个部分的参数值的简单技巧/方法

发布于 2024-12-18 16:10:01 字数 399 浏览 1 评论 0原文

我正在寻找一种简单的技巧/方法来修改Perl中INI文件中某个部分的参数值,正如你所知,INI文件中的所有参数都具有相同的名称(这是它的大问题),只有部分名称可以使区别,但我认为这对我的情况没有帮助:

Section1

param1=s1value1

param2=val1

Section2

param1=s2value2

param2=val2

Section3

param1=s3value3

param2=val3

我想将Section2的参数param2的值val2更改为valN,任何想法,我在CPAN上查看了模块,但是模块需要模块等等,我从来没有让它工作过,我认为有一个简单的方法hein ?

I'm looking for An easy trick/Way to modify paramter value of a section in INI file in Perl, as you may know, all parameter in INI file have the same name (that's its big problem), only the section name can make the difference, but I don't think that it will help in my case:

Section1

param1=s1value1

param2=val1

Section2

param1=s2value2

param2=val2

Section3

param1=s3value3

param2=val3

I want to change value val2 of parameter param2 of Section2 to valN, Any idea, I looked on module on CPAN, but module needs module and so on, I never had it working, I think that there is an easy way hein?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

意中人 2024-12-25 16:10:01

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

This looks like a non-standard INI file, which would have sections indicated by square brackets: [Section Name]. However, a line not containing an equals sign is easy enough a specification.

So here's a sub that hunts down the section and keyname and changes the value.

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> );
}
黯淡〆 2024-12-25 16:10:01

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

Try using 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);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文