我正在尝试使用一个脚本来更新输入文件中的变量。 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;
}
的更新 的
我正在尝试更新文件句柄中指向的文件。我是否只能通过打印声明来完成此操作。如果是这种情况我只想重印那一行。这可能吗?
答案 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;