-1

我有一个包含以下行的文件 #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=100 替换为数组的 SerialPort=500,我想匹配循环中的所有其他元素我试过的代码不起作用请改进下面的代码,我认为正则表达式不起作用,每次如果条件匹配和替换导致错误,并且当我在执行脚本文件后查看文件时,文件包含重复项。

#!/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);
4

2 回答 2

0

use strict;@Maruti:永远不要在没有and的情况下编写 perl 程序use warnings;。我已经修改了你的代码。看看吧。

代码:

#!/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);
于 2014-11-12T13:51:19.827 回答
0

Perl 101 use strict; use warnings;:.

使用 .为变量名添加前缀$

$old_file当您尝试打开它时,它是 undef。

并且拼写falg正确,如果你打开了这些选项,你就会被告知。

另外:在提出关于 SO 的问题时,如果您指出什么不起作用,这将很有帮助。

于 2014-11-12T12:42:12.053 回答