如何用perl替换包含另一行的正则表达式字符的行?

时间:2014-08-28 11:41:20

标签: regex perl

我有以下代码,我试图用另一行替换文件中的certine行:

my %hFiles = (
    "file.v" => {
        "assign clk_2 = dft_clk_mux? clk : clk_2_r;" =>
            "clock_mux2 U_clock_mux2  .a(clk_2_r), .b(clk), .sel(dft_clk_mux), .z(clk_2));",
    },
);

foreach my $file ( keys %hFiles ) {
    open( my $input_file_handle, "<", $file ) or die "Can't open input file $file\n";
    open( my $output_file_handle, ">", "$result_dir/$file" ) or die "Can't create output file\n";
    my $output_file_string = `cat $file`;
    foreach my $line ( keys %{ $hFiles{$file} } ) {
        $output_file_string =~ s/$line)\n/$hFiles{$file}{$line}\n/g;
        print "$file\n$line\n$hFiles{$file}{$line}\n";
    }
    print $output_file_handle $output_file_string;
}

但是这个改变不起作用。我认为这是因为我的行包含regexp characther所以我试图将其替换为:

my %hFiles = (
    "file.v" => {
        "assign clk_2 = dft_clk_mux\? clk : clk_2_r;" =>
            "clock_mux2 U_clock_mux2  \.a\(clk_2_r\), \.b\(clk\), .sel\(dft_clk_mux\), \.z\(clk_2\)\);",
    },
);

但它仍然不起作用, 如何在文件中替换此行才能成功?

谢谢

1 个答案:

答案 0 :(得分:1)

删除$line后的括号并引用特殊字符:

$output_file_string =~ s/$line)\n/$hFiles{$file}{$line}\n/g;

变为:

$output_file_string =~ s/\Q$line\E\n/$hFiles{$file}{$line}\n/g;