regex - Perl:如何扩展嵌套变量名

标签 regex perl

到目前为止,我有一个文本配置文件,其中包含如下变量:

foo=something
bar=${foo}

在 Perl 中处理它时,我用这样的正则表达式替换变量:
s/(?<!\\)\$\{\s*([^\}\s]+(\s+[^\}\s]+)*)\s*\}/_replacement( $1 )/ge;

其中 _replacement() 知道如何查找现有值。

现在我希望能够扩展文本文件的语法,以便我可以递归地执行此操作,如下所示:
platform=x86
foo_x86=somepc
foo_arm=somedevice
bar=${foo_${platform}}

在处理最后一行时,“${platform}”首先被替换为“x86”,然后产生的“${foo_x86}”被替换为“somepc”。

我在扩展我的正则表达式时遇到了麻烦:我似乎无法找到将 } 与正确的 { 匹配的方法。 (贪婪不起作用,因为字符串可能是“${a}${b}”,非贪婪将不匹配。)

想法?

最佳答案

sub expand {
   my ($vars, $s) = @_;
   $s =~ s{
      (
         \$\{
         (
            (?> [^\$\}]
            |   \$ (?! \{ )
            |   (?1)
            )++
         )
         \}
      )
   }{
      my $expanded = expand($vars, $2);
      $vars->{$expanded} // "\${$expanded}"    # /
   }xeg;
   return $s;
}

my $vars = {};
while (<DATA>) {
   chomp;
   my ($key, $val) = split(/=/, $_, 2);
   $vars->{$key} = expand($vars, $val);
}

print($vars->{bar}, "\n");

__DATA__
platform=x86
foo_x86=somepc
foo_arm=somedevice
bar=${foo_${platform}}

关于regex - Perl:如何扩展嵌套变量名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32832079/

相关文章:

c# - 正则表达式多重替换

javascript - 正则表达式替换与任何字符匹配的所有内容

linux - Perl shebang 行的最大长度?

perl - 如何在 PostgreSQL PLPerl 函数中进行日期/时间操作

Perl:不推荐使用哈希作为引用

perl - 如何在 Cygwin 中安装 Perl 库?

c++ - 有条件地替换字符串中的正则表达式匹配

asp.net - ASP.NET 中的正则表达式验证器 for\*,\|,\^,\~

regex - 如何为 Makefile 编写 Perl 单行,以便我可以将文字\n 转换为换行符?

Perl Log::Dispatch:在运行中更改日志记录位置?