我有一个包含以下行的文件
#comments abc
#comments xyz
SerialPort=100
Baudrate=9600
Parity=2
Databits=8
Stopbits=1
我也有数组@in =(SerialPort = 500,Baudrate = 300,parity = 0,Databits = 16,Stopbits = 0),这些数组元素从浏览器读取,我正在尝试编写perl脚本以匹配“SerialPort “在文件中用SerialPort = 500的数组替换文件中的SerialPort = 100,我希望匹配循环中的所有其他元素我试过代码不工作请改进下面的代码,我认为正则表达式不工作,每次条件匹配和替换导致false,并且当我在执行脚本文件后查看文件包含重复项时。
#!/usr/bin/perl
$old_file = "/home/work/conf";
open (fd_old, "<", $old_file) || die "cant open file";
@read_file = <fd_old>;
close (fd_old);
@temp = ();
$flag = 0;
foreach $infile ( @read_file )
{
foreach $rr ( @in )
{
($key, $value ) = split(/=/, $rr );
if ( $infile =~ s/\b$key\b(.*)/$rr/ )
{
push ( @temp , $infile );
$flag = 0;
}
else
{
$flag = 1;
}
}
if ( $flag )
{
push (@temp, $infile );
}
}
open ( fd, ">", $old_file ) || die "can't open";
print fd @temp;
close(fd);
答案 0 :(得分:0)
Perl 101:use strict;
use warnings;
。
使用$
前缀变量名称。
$old_file
是undef。
拼写falg
正确,如果你打开这些选项,你就会被告知。
另外:在提问时,如果你指出什么不起作用,那就很有帮助。
答案 1 :(得分:0)
@Maruti:永远不要编写没有use strict;
和use warnings;
的perl程序。我修改了你的代码。看看吧。
<强>代码:强>
#!/usr/bin/perl
use strict;
use warnings;
my $old_file = "/home/work/conf";
open (my $fh, "<", $old_file) || die "cant open file";
my @read_file = <$fh>;
close ($fh);
my @temp = ();
my @in = ('SerialPort=500' , 'Baudrate=300', 'parity=0', 'Databits=16', 'Stopbits=0');
foreach my $infile ( @read_file )
{
foreach my $rr ( @in )
{
my ($key, $value) = split(/=/, $rr );
if ( $infile =~ m/\b$key\b\=\d+/ && $infile =~ /#.*/)
{
$infile =~ s/\b$key\b\=\d+/$rr/ig;
}
}
push (@temp, $infile );
}
open (my $out, ">", $old_file ) || die "can't open";
foreach my $res(@temp)
{
print $out $res;
}
close($out);