首页 > 解决方案 > 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 个。

任何人都可以提供一些帮助吗?

德里克

标签: perl

解决方案


你只检查一个。

 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 正则表达式教程


推荐阅读