perl - Perl 问题。需要一种方法来替换同一行上的两个变量
问题描述
我正在尝试在 Perl 中编写一个替换脚本,并且我让它工作到一半,但似乎我无法替换同一行中的两个字符串。
我有一个名为foo.json的 json 文件,其中包含以下行:"title": "%CLIENT% Dashboard Web Map %WEBMAPENV%",
现在,我有了第二个名为env.txt的文件,其中包含我希望使用的所有变量。在此文件中,有一个名为: 的条目%WEBMAPENV%=(Test-Dev)
。我的目标是让 PERL 读取文件 env.txt,并同时替换 BOTH "%CLIENT% 和 %WEBMAPENV%。
到目前为止,这是我的代码:
my $envFilePath = "$dirScripts/env/env.txt";
# Reading Firebase variables from Test environment file.
open($fh, "<", $envFilePath);
while (my $line=<$fh>) {
if ($line eq "\n") {
next;
}
if ($line =~ m/^(%\w+%)=/) {
$cur_key = $1;
$line =~ s/$cur_key=//;
$replacements{$cur_key} = $line;
} else {
$replacements{$cur_key} .= $line;
}
}
...
my $targetFilePath3 = "$dirHome/foo.json";
tie my @v_lines, 'Tie::File', $targetFilePath3, autochomp => 0 or die $!;
replaceEnvVars(@v_lines);
# Replace the environment variables as part of the setup.
sub replaceEnvVars {
for my $line (@_) {
if ($line =~ m/(%\w+%)/) {
my $key = $1;
if (defined($replacements{$key})) {
my $value = $replacements{$key};
chomp $value;
$line =~ s/$key/$value/g;
}
}
}
untie @_;
}
我每行只能替换一个变量,但我需要能够处理 2 个。
任何人都可以提供一些帮助吗?
德里克
解决方案
你只检查一个。
if ($line =~ m/(%\w+%)/) { ... }
解决方案:
# Clean up %replacements before using it.
chomp for values %replacements;
for my $line (@_) {
$line =~ s{(%\w+%)}{ $replacements{$1} // $1 }eg;
}
通过在内部添加一个循环s///
(通过使用/g
)而不是一个循环s///
,如果值包含,这个不会搞砸%
。
/e
表示替换将作为 Perl 代码运行。
//
是“定义或”运算符。它的作用就像||
但寻找defined
而不是真理。
有关更多信息,请参阅Perl 正则表达式教程。
推荐阅读
- python - 返回子集和问题中的数组元素
- laravel - 图像在数据库 laravel 中另存为 .tmp 文件
- powershell - 用于确认 AD 中符合 RCF 的 DN 的 PowerShell 脚本
- maven - 使用 jar 中的 pom.xml 从 uber jar 中调用 maven
- amazon-web-services - 无法 ping 同一私有子网中的 ec2 实例
- python - 读取多个 CSV 文件,然后根据文件名重命名文件
- mysql - 从表中过滤特定数据
- excel - 如何使用 VBA 和 Match 函数更新 Excel 表格中的单元格值?
- powershell - 在PowerShell中传递空日期时间参数
- lua - Lua - 如何在一个打印语句中打印两件事