匹配文件中的字符串并替换为其他字符串

时间:2014-11-12 12:35:04

标签: perl webmin webmin-module-development

我有一个包含以下行的文件     #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);

2 个答案:

答案 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);