我正在尝试拥有一个将在输入文件中更新变量的脚本。正则是匹配的,但没有执行替代。我究竟做错了什么。
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}RPs{2}=s{2})d+)/$powerLevel/) {
print $_;
print "Updating Input File for Power Level: $powerLevel";
}
}
close INPUTFILE;
}
update
我正在尝试更新文件handle中指向的文件。我只能通过打印语句来做到这一点。如果是这样,我只想重印一行。这可能吗?
您可以使用Perl的原位编辑:
sub updateInputDeck {
my $powerLevel = shift;
my $file = $outputFiles{input};
local @ARGV = ($file);
local $^I = '.bac';
while( <> ){
s/((?<=s{3}RPs{2}=s{2})d+)/$powerLevel/;
print;
}
#unlink "$file$^I" or die "Can't delete backup";
return;
}
还要注意,您将全局$outputFiles{input}
用作功能的参数是不良样式实践。而是将其作为参数传递给您的函数。
我认为您必须在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}RPs{2}=s{2})d+)/$powerLevel/;
print INPUTFILE $line;
}
close INPUTFILE;