在外部文件Perl中使用RegEX替换文本

时间:2014-03-12 19:12:39

标签: regex perl file-io

我正在尝试使用一个脚本来更新输入文件中的变量。 RegEx匹配但不执行替换。我究竟做错了什么。

sub updateInputDeck {
my $powerLevel = shift;
my $file = $outputFiles{input};
open INPUTFILE,"<",$file or die "Cannot open file $file $!\n";
while (<INPUTFILE>) {
    if (s/((?<=\s{3}RP\s{2}=\s{2})\d+)/$powerLevel/) {
        print $_;
        print "Updating Input File for Power Level: $powerLevel";
     }
}
close INPUTFILE;
}

更新

我正在尝试更新文件句柄中指向的文件。我是否只能通过打印声明来完成此操作。如果是这种情况我只想重印那一行。这可能吗?

2 个答案:

答案 0 :(得分:3)

您可以使用perl的in-place editing

sub updateInputDeck {
    my $powerLevel = shift;
    my $file = $outputFiles{input};

    local @ARGV = ($file);
    local $^I = '.bac';
    while( <> ){
        s/((?<=\s{3}RP\s{2}=\s{2})\d+)/$powerLevel/;
        print;
    }

    #unlink "$file$^I" or die "Can't delete backup";

    return;
}

另请注意,使用全局$outputFiles{input}作为函数的参数是一种糟糕的样式练习。而是将它作为参数传递给你的函数。

答案 1 :(得分:1)

我认为你必须在2次传球中完成。首先将整个文件读入一个数组,在本地编辑并将整个内容写回来,覆盖原始文件。

open INPUTFILE,"<$file" or die "Cannot open file $file $!\n";
my @lines = <INPUTFILE>; # Read in entire file.
close INPUTFILE;

open INPUTFILE,">$file" or die "Cannot open file $file $!\n";
foreach $line (@lines) {
  $line =~ s/((?<=\s{3}RP\s{2}=\s{2})\d+)/$powerLevel/;
  print INPUTFILE $line;
}
close INPUTFILE;