替换 $variable,它会改变 while 循环中的每次迭代

问题描述 投票:0回答:2

我有两个输入文件:

filea
fileb
。在
filea
中,我有一个字符串
$pc_count$
,其中
fileb
中,有数字和字符串。我必须在
fileb
中搜索数字并替换
$pc_count$
中的
filea

我已经尝试过下面的代码,但是

fileb
的第一个值每次都会重复(
$pc_count$
)。

open (IN_FILE, "<filea") or die "Please provide an correct file path\n";
open (IN_FILE1, "<fileb") or die "Please provide an correct file path\n";
my $i = 0;
while (<IN_FILE>) {
        if($_ =~ /\$pc_count\$/) {
                my $line = $_;
                while (<IN_FILE1>) {

                        if($_ =~ /([a-z0-9-]+)[\s]+/) {
                                my $first = $1; 
                                $line =~ s/\$pc_count\$/$first/;
                                #print OUT_FILE("$line");
                                print $line;

                        }

                }

        }
        #print OUT_FILE("$_");
}
close IN_FILE;
close IN_FILE1;

文件a

case(pc)
    'h$pc_count$ : $display("checkdata string %s ",pc_string);
endcase

文件b

fe0000
fe0001
fe0002
fe0003
..
..
..

结果:

case(pc)
    'hfe000 : $display("checkdata string %s ",pc_string);
    'hfe000 : $display("checkdata string %s ",pc_string);
    'hfe000 : $display("checkdata string %s ",pc_string);
    'hfe000 : $display("checkdata string %s ",pc_string);
    ..
    ..
    ..
    ..  
endcase
regex perl
2个回答
1
投票

[我必须修复代码中的语法错误才能运行它。请确保您向我们提供可运行的代码。]

问题在于

$line
中存储的内容。

您迭代

IN_FILE
文件句柄,直到找到包含
$pc_count$
的行。然后将该行复制到
$line
并进入内部处理循环。

所以第一次循环你的内循环时,

$line
包含:

'h$pc_count$ : $display("checkdata string %s ",pc_string);

几行之后,您可以使用以下代码更改

$line

$line =~ s/\$pc_count\$/$first/;

所以

$line
现在包含:

'hfe000 : $display("checkdata string %s ",pc_string);

下次循环时,您将从

$line
开始,其中包含以
hfe000
开头的字符串。因此,当您尝试第二次运行替换时,不会发生任何变化,因为
$line
不再包含
$pc_count$

最简单的修复可能是根本不更改

$line
,而是直接打印替换的输出(并使用
/r
,这样原始字符串就不会改变)。

if($_ =~ /([a-z0-9-]+)[\s]+/) {
    my $first = $1;
    print $line =~ s/\$pc_count\$/$first/r;
}

产生:

'hfe0000 : $display("checkdata string %s ",pc_string);
'hfe0001 : $display("checkdata string %s ",pc_string);
'hfe0002 : $display("checkdata string %s ",pc_string);
'hfe0003 : $display("checkdata string %s ",pc_string);

0
投票

第一次替换后,

$line
发生更改,并且不再包含字符串
$pc_count$
。 解决此问题的一种方法是将原始行的副本保留在另一个变量中 (
$line2
):

use warnings;
use strict;

open (IN_FILE, "<filea") or die "Please provide an correct file path\n";
open (IN_FILE1, "<fileb") or die "Please provide an correct file path\n";
my $i = 0;

while (<IN_FILE>) {
        if ($_ =~ /\$pc_count\$/) {
                my $line = $_;
                while (<IN_FILE1>) {
                        my $line2 = $line;
                        if ($_ =~ /([a-z0-9-]+)[\s]+/) {
                                my $first = $1; 
                                $line2 =~ s/\$pc_count\$/$first/;
                                print $line2;
                        }
                }
        }
        #print OUT_FILE("$_");
}
close IN_FILE;
close IN_FILE1;

输出:

'hfe0000 : $display("checkdata string %s ",pc_string);
'hfe0001 : $display("checkdata string %s ",pc_string);
'hfe0002 : $display("checkdata string %s ",pc_string);
'hfe0003 : $display("checkdata string %s ",pc_string);
© www.soinside.com 2019 - 2024. All rights reserved.