我对如何实现搜索和替换下面显示的结果感到茫然。有些灵魂可以指导我吗?
Input.txt(包含要替换的变量的输入文件):
parameter EIW=3.4
parameter WQA=6.6 + 43.5 + 55.8
parameter IID=4.64
...
parameter KDO=2.322 * 393.3
NewVariableValues.txt(源文件中的参数值将替换为此文件中的新值):
parameter ACE=newparam1
parameter WQA=newparam2
parameter KDO=newparam3
...
Output.txt的:
parameter EIW=3.4
parameter WQA=newparam2 + 43.5 + 55.8
parameter IID=4.64
...
parameter KDO=newparam3 * 393.3
答案 0 :(得分:0)
我不确定在=
故意后是否吞噬了第一个值,但假设它是,这里没有太多的错误检查:
use strict;
use warnings;
my $replacements = shift or die "missing arg";
open my $fh, '<', $replacements or die "can't open $replacements: $!";
# Slurp file and build a hash of intended replacements
my %rep = map { /^parameter ([^=]+)=(\S+)/ } <$fh>;
close $fh;
while(<STDIN>) {
# Replace text after the = with a hash lookup if possible
s/^parameter ([^=]+)=(\S+)/sprintf "parameter %s=%s", $1, $rep{$1}||$2/e;
print;
}
您将替换文件作为参数传递,并在STDIN上提供原始输入。当然,通常应检查文件中的格式错误,空行等;这样的东西现在只会抛出错误或警告。
答案 1 :(得分:0)
使用/e
修饰符
该程序首先打开文件NewVariableValues.txt
并从中构建一个哈希%new_values
,将每个新参数名称与其值相关联。然后读取文件Input.txt
,并将所有value
构造中的NAME=value
替换为散列中的相应值
use strict;
use warnings;
use v5.14.1;
use autodie;
my %new_values;
{
open my $fh, '<', 'NewVariableValues.txt';
while ( <$fh> ) {
$new_values{$1} = $2 if /([^\s=]+)=(.+)/;
}
}
{
open my $fh, '<', 'Input.txt';
while ( <$fh> ) {
s<([^\s=]+)=\K(\S+)><$new_values{$1} // $2>e;
print;
}
}
parameter EIW=3.4
parameter WQA=newparam2 + 43.5 + 55.8
parameter IID=4.64
...
parameter KDO=newparam3 * 393.3
答案 2 :(得分:-1)
行示例:parameter WQA=6.6 + 43.5 + 55.8
您可以尝试以下方式:
line =~ s/(parameter WQA= ?)([0-9.]+)/\1$newparam1/
(假设您知道如何从文件中获取newparam1)