到目前为止,我有一个文本配置文件,其中包含如下变量:
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/