gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:48:21 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com