我想打开一个文件并从文件中替换一个单词。 我的代码附在此处。
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) ;
结果: 模式未找到
未找到模式
未找到模式
未找到模式
此致
第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,
答案 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";