如何在perl中修改.ini文件

如何在perl中修改.ini文件,perl,Perl,我正在尝试编写一个脚本,该脚本将修改InI文件中的4行: 下面是我的Ini文件的内容: gEnableImps=1 gEnableBmps=1 gEnableSuspend=3 gDot11Mode=0 gEnableHandoff=0 gRoamingTime=0 Intf0MacAddress=000AF6798980 Intf1MacAddress=000AF5788981 Intf2MacAddress=000AF2898982 Intf3MacAddress=000AF58939

我正在尝试编写一个脚本,该脚本将修改InI文件中的4行:

下面是我的Ini文件的内容:

gEnableImps=1
gEnableBmps=1
gEnableSuspend=3
gDot11Mode=0
gEnableHandoff=0
gRoamingTime=0 


Intf0MacAddress=000AF6798980
Intf1MacAddress=000AF5788981
Intf2MacAddress=000AF2898982
Intf3MacAddress=000AF5893983


InfraUapsdVoSrvIntv=0 
InfraUapsdViSrvIntv=0
InfraUapsdBeSrvIntv=0
InfraUapsdBkSrvIntv=0 


DelayedTriggerFrmInt=18000


gEnableFWRssiMonitoring=0  
Intf0MacAddress=000AF6798980
Intf1MacAddress=000AF5788981
Intf2MacAddress=000AF2898982
Intf3MacAddress=000AF5893983
6798980  after change -> 6791280
5788981  after change -> 5783481   
2898982  after change -> 2897682
#!/usr/bin/perl -w
use strict;
open(FH,"+<","WCN1314_qcom_cfg.ini")
                       or die "File not found";

my @lines=<FH>;
foreach my $line (@lines)
{
  if(($line =~ /Intf0MacAddress/ ||$line =~ /Intf1MacAddress/||$line =~ /Intf2MacAddress/||$line =~ /Intf3MacAddress/) )
{
  print "$line\n";
}  
else
{
  print "Not found\n";
}
}  
我必须每天修改以下四行:

gEnableImps=1
gEnableBmps=1
gEnableSuspend=3
gDot11Mode=0
gEnableHandoff=0
gRoamingTime=0 


Intf0MacAddress=000AF6798980
Intf1MacAddress=000AF5788981
Intf2MacAddress=000AF2898982
Intf3MacAddress=000AF5893983


InfraUapsdVoSrvIntv=0 
InfraUapsdViSrvIntv=0
InfraUapsdBeSrvIntv=0
InfraUapsdBkSrvIntv=0 


DelayedTriggerFrmInt=18000


gEnableFWRssiMonitoring=0  
Intf0MacAddress=000AF6798980
Intf1MacAddress=000AF5788981
Intf2MacAddress=000AF2898982
Intf3MacAddress=000AF5893983
6798980  after change -> 6791280
5788981  after change -> 5783481   
2898982  after change -> 2897682
#!/usr/bin/perl -w
use strict;
open(FH,"+<","WCN1314_qcom_cfg.ini")
                       or die "File not found";

my @lines=<FH>;
foreach my $line (@lines)
{
  if(($line =~ /Intf0MacAddress/ ||$line =~ /Intf1MacAddress/||$line =~ /Intf2MacAddress/||$line =~ /Intf3MacAddress/) )
{
  print "$line\n";
}  
else
{
  print "Not found\n";
}
}  
在以上几行中,我需要更改6798980、578898128989825893983部分,我的意思是在每个数字中,任何到连续的数字都应该更改,更改的数字不应该得到另一个数字的副本,即在每个数字中,唯一的数字应该更改

Exp:

gEnableImps=1
gEnableBmps=1
gEnableSuspend=3
gDot11Mode=0
gEnableHandoff=0
gRoamingTime=0 


Intf0MacAddress=000AF6798980
Intf1MacAddress=000AF5788981
Intf2MacAddress=000AF2898982
Intf3MacAddress=000AF5893983


InfraUapsdVoSrvIntv=0 
InfraUapsdViSrvIntv=0
InfraUapsdBeSrvIntv=0
InfraUapsdBkSrvIntv=0 


DelayedTriggerFrmInt=18000


gEnableFWRssiMonitoring=0  
Intf0MacAddress=000AF6798980
Intf1MacAddress=000AF5788981
Intf2MacAddress=000AF2898982
Intf3MacAddress=000AF5893983
6798980  after change -> 6791280
5788981  after change -> 5783481   
2898982  after change -> 2897682
#!/usr/bin/perl -w
use strict;
open(FH,"+<","WCN1314_qcom_cfg.ini")
                       or die "File not found";

my @lines=<FH>;
foreach my $line (@lines)
{
  if(($line =~ /Intf0MacAddress/ ||$line =~ /Intf1MacAddress/||$line =~ /Intf2MacAddress/||$line =~ /Intf3MacAddress/) )
{
  print "$line\n";
}  
else
{
  print "Not found\n";
}
}  
我已经写了代码,但无法更改号码。。有人能帮我吗

我的脚本:

gEnableImps=1
gEnableBmps=1
gEnableSuspend=3
gDot11Mode=0
gEnableHandoff=0
gRoamingTime=0 


Intf0MacAddress=000AF6798980
Intf1MacAddress=000AF5788981
Intf2MacAddress=000AF2898982
Intf3MacAddress=000AF5893983


InfraUapsdVoSrvIntv=0 
InfraUapsdViSrvIntv=0
InfraUapsdBeSrvIntv=0
InfraUapsdBkSrvIntv=0 


DelayedTriggerFrmInt=18000


gEnableFWRssiMonitoring=0  
Intf0MacAddress=000AF6798980
Intf1MacAddress=000AF5788981
Intf2MacAddress=000AF2898982
Intf3MacAddress=000AF5893983
6798980  after change -> 6791280
5788981  after change -> 5783481   
2898982  after change -> 2897682
#!/usr/bin/perl -w
use strict;
open(FH,"+<","WCN1314_qcom_cfg.ini")
                       or die "File not found";

my @lines=<FH>;
foreach my $line (@lines)
{
  if(($line =~ /Intf0MacAddress/ ||$line =~ /Intf1MacAddress/||$line =~ /Intf2MacAddress/||$line =~ /Intf3MacAddress/) )
{
  print "$line\n";
}  
else
{
  print "Not found\n";
}
}  
#/usr/bin/perl-w
严格使用;

open(FH,“+我不明白你想对这些数字做什么。你能试着详细解释一下吗?你确定你的例子是正确的吗?你能解释一下为什么有些数字改变了,而有些数字没有改变吗

无论如何,您可以使用以下内容:

#!/usr/bin/perl
use warnings;
use strict;

my $file = 'WCN1314_qcom_cfg';
open my $OLD, '<', "$file.ini" or die $!;
open my $NEW, '>', "$file.new" or die $!;
my $digit = 1;
while (my $line = <$OLD>) {
    if (my ($num, $addr) = $line =~ /^Intf([0-3])MacAddress=000AF([0-9]+)/) {
        my @digits = split //, $addr;

        # Do what you need with the digits

        $line = "Intf${num}MacAddress=000AF" . (join q(), @digits) . "\n";
    }
    print {$NEW} $line;
}
close $NEW;
close $OLD;

if (-f "$file.bak") { unlink "$file.bak" or die "Cannot remove backup: $!"; }
rename "$file.ini", "$file.bak"          or die "Cannot backup.";
rename "$file.new", "$file.ini"          or die "Cannot create ini.";
!/usr/bin/perl
使用警告;
严格使用;
my$file='WCN1314_qcom_cfg';
打开我的$OLD、“$file.new”或die$!;
我的$digit=1;
while(我的$line=){
如果(my($num,$addr)=$line=~/^Intf([0-3])MacAddress=000AF([0-9]+)/){
my@digits=split/,$addr;
#用数字做你需要的
$line=“Intf${num}MacAddress=000AF”。(join q(),@digits)。“\n”;
}
打印{$NEW}$行;
}
关闭$NEW;
关闭$OLD;
如果(-f“$file.bak”){unlink“$file.bak”或die“无法删除备份:$!”;}
重命名“$file.ini”、“$file.bak”或“无法备份”;
重命名“$file.new”、“$file.ini”或“无法创建ini。”;

我不明白你想对这些数字做什么。你能试着详细解释一下吗?你确定你的例子是正确的吗?你能解释一下为什么有些数字变了而有些数字没有变吗

无论如何,您可以使用以下内容:

#!/usr/bin/perl
use warnings;
use strict;

my $file = 'WCN1314_qcom_cfg';
open my $OLD, '<', "$file.ini" or die $!;
open my $NEW, '>', "$file.new" or die $!;
my $digit = 1;
while (my $line = <$OLD>) {
    if (my ($num, $addr) = $line =~ /^Intf([0-3])MacAddress=000AF([0-9]+)/) {
        my @digits = split //, $addr;

        # Do what you need with the digits

        $line = "Intf${num}MacAddress=000AF" . (join q(), @digits) . "\n";
    }
    print {$NEW} $line;
}
close $NEW;
close $OLD;

if (-f "$file.bak") { unlink "$file.bak" or die "Cannot remove backup: $!"; }
rename "$file.ini", "$file.bak"          or die "Cannot backup.";
rename "$file.new", "$file.ini"          or die "Cannot create ini.";
!/usr/bin/perl
使用警告;
严格使用;
my$file='WCN1314_qcom_cfg';
打开我的$OLD、“$file.new”或die$!;
我的$digit=1;
while(我的$line=){
如果(my($num,$addr)=$line=~/^Intf([0-3])MacAddress=000AF([0-9]+)/){
my@digits=split/,$addr;
#用数字做你需要的
$line=“Intf${num}MacAddress=000AF”。(join q(),@digits)。“\n”;
}
打印{$NEW}$行;
}
关闭$NEW;
关闭$OLD;
如果(-f“$file.bak”){unlink“$file.bak”或die“无法删除备份:$!”;}
重命名“$file.ini”、“$file.bak”或“无法备份”;
重命名“$file.new”、“$file.ini”或“无法创建ini。”;
#!/usr/bin/perl-w
严格使用;
开放式(FH,“+”,“WCN1314_qcom_cfg.ini”);
打印FH$文件;
关闭FH;
#!/usr/bin/perl-w
严格使用;
开放式(FH,“+”,“WCN1314_qcom_cfg.ini”);
打印FH$文件;
关闭FH;

无需通过自己解析和编写.ini文件来重新发明轮子。我建议使用CPAN中的或其他类似模块。此代码只需3行即可满足您的需要

my $cfg = Config::IniFiles->new( -file => $file, -fallback => 'GENERAL' );
$cfg->setval('GENERAL', 'Intf0MacAddress', '999999999999');
$cfg->RewriteConfig;

无需通过自己解析和编写.ini文件来重新发明轮子。我建议使用CPAN中的或其他类似模块。此代码只需3行即可满足您的需要

my $cfg = Config::IniFiles->new( -file => $file, -fallback => 'GENERAL' );
$cfg->setval('GENERAL', 'Intf0MacAddress', '999999999999');
$cfg->RewriteConfig;

谢谢Choroba..有了你的想法,我做了一些更改,现在可以工作了:)谢谢Choroba..有了你的想法,我做了一些更改,现在可以工作了:)-1:全局文件句柄,
join
ing整个文件(要发出声音,请执行
my$file=do{local$/;};
),在不依赖任何特殊功能的情况下使用
5.010
,使用C样式循环(而是:
用于我的$index(0..4)
),没有
\Q$foo\E
保护的regex插值,不必要的捕获,最糟糕的是:使用
$&
变量。感谢您的关注!您的评论将帮助我最有效地使用perl语言!-1:全局文件句柄,
连接整个文件(要发出声音,请执行
我的$file=do{local$/;};
),在不依赖任何特殊功能的情况下使用
5.010
,使用C样式循环(而是:
用于我的$index(0..4)
),不带
\Q$foo\E
保护的正则表达式插值,不必要的捕获,最糟糕的是使用
$&
变量。感谢您的关注!您的评论将帮助我最有效地使用perl语言!