打开一个文件并使用perl替换一个单词

时间:2013-12-05 09:52:35

标签: perl

我想打开一个文件并从文件中替换一个单词。 我的代码附在此处。

open(my $fh, "<", "pcie_7x_v1_7.v") or die "cannot open <pcie_7x_v1_7.v:$!";

while (my $line = <$fh>) {
  if ($line =~ timescale 1 ns) {
    print $line $msg = "pattern found \n ";
    print "$msg";
    $line =~ s/`timescale 1ns/`timescale 1ps/;
  }
  else {
    $msg = "pattern not found \n ";
    print "$msg";
  }
}

文件包含模式timescale 1ns/1ps。 我的要求是将timescale 1ns/1ps替换为timescale 1ps/1ps

目前其他情况总是发生。

收到评论后更新代码: 嗨, 感谢您的快速解决方案。 我相应地更改了代码,但结果不成功。 我在这里附上了更新的代码。 如果我在这里错过了什么,请建议我。

  use strict;
  use warnings;

open(my $fh, "<", "pcie_7x_v1_7.v" )
or die "cannot open <pcie_7x_v1_7.v:$!" ;
open( my $fh2, ">", "cie_7x_v1_7.v2")
or die "cannot open <pcie_7x_v1_7.v2:$!" ;

while(my $line = <$fh> )
{

  print $line ;

  if ($_ =~ /timescale\s1ns/ )
  {
   $msg = "pattern found \n " ;
   print "$msg" ;
   $_ =~ s/`timescale 1ns/`timescale 1ps/g ;
  }
  else
  {
   $msg = "pattern not found \n " ;
   print "$msg" ;
  }
  print $fh2 $line ;

  }
  close($fh)  ;
  close($fh2) ;

结果: 模式未找到

未找到模式

未找到模式

未找到模式

此致

BINU

第3次更新:        //文件:pcie_7x_v1_7.v          //版本:1.7           //           //描述:7系列解决方案包装:PCI Express的端点         //           // ------------------------------------------------ --------------------------------

  //`timescale 1ps/1ps
    `timescale 1ns/1ps

  (* CORE_GENERATION_INFO = "pcie_7x_v1_7,pcie_7x_v1_7, 

1 个答案:

答案 0 :(得分:5)

您可以从命令行使用perl oneliner。无需编写脚本。

perl -p -i -e "s/`timescale\s1ns/`timescale 1ps/g" pcie_7x_v1_7.v

-

然而,

如果您仍想使用该脚本,那么您几乎就在那里。你只需修复一些错误

print $line; #missing 

if ($line =~ /timescale\s1ns/) #made it a real regex, this should match now

$line =~ s/`timescale 1ns/`timescale 1ps/g ; #added g to match all occurences in line

if-else后,您必须再次将该行打印到文件

例如,在脚本开头打开一个新文件进行编写(让我们称之为'pcie_7x_v1_7.v.2')

open(my $fh2, ">", "pcie_7x_v1_7.v.2" ) or die "cannot open <pcie_7x_v1_7.v.2:$!" ;

然后,在else块之后只需将该行(无论是否更改)打印到文件

print $fh2 $line;

完成后不要忘记关闭文件句柄

close($fh);
close($fh2);

修改

您的主要问题是您使用$_进行检查,而您已将该行分配给$line。所以你做了print $line,然后是if ($_ =~ /timescale/。那永远不会奏效。 我复制粘贴你的脚本并进行了一些修正,并将其格式化得更加密集,以便更好地适应网站。我还根据TLP的建议删除了if match检查,并直接在if中进行了替换。它有完全相同的结果。这有效:

use strict;
use warnings;

open(my $fh, "<", "pcie_7x_v1_7.v" )
    or die "cannot open <pcie_7x_v1_7.v:$!" ;
open( my $fh2, ">", "pcie_7x_v1_7.v2")
    or die "cannot open >pcie_7x_v1_7.v2:$!" ;

while(my $line = <$fh> ) {
    print $line;
    if ($line =~ s|`timescale 1ns/1ps|`timescale 1ps/1ns|g) {
        print "pattern found and replaced\n ";
    }
    else {
        print "pattern not found \n ";
    }
    print $fh2 $line ;
}
close($fh);
close($fh2);

#now it's finished, just overwrite the old file with the new file
rename "pcie_7x_v1_7.v2", "pcie_7x_v1_7.v";