我有$entire_line
= "if varC > 0: varB = varC + 2"
我希望我的正则表达式在varC
varB
,varB
,$entire_line
然后需要检查这些匹配以查看它们是否存在于HashMap
中。如果是这样,则应在比赛中附加$
。
因此输出应为:
"if $varC > 0: $varB = $varC + 2"
注意:0
和2
未显示在HashMap
。
目前,我有:
$entire_line =~ s/(\w+)/\$$1/g if (exists($variable_hash{$1}));
但是,由于$1
中的exists($variable_hash{$1})
未引用之前的正则表达式,因此无法正常工作:$entire_line =~ s/(\w+)/\$$1/g
有没有正确的方法来解决这个问题?
感谢您的帮助。
答案 0 :(得分:1)
使用/e
修饰符并将代码放入替换部分:
$entire_line =~ s/(\w+)/exists $variable_hash{$1} ? $variable_hash{$1} : $1/ge;
答案 1 :(得分:0)
如果我正确地提出了你的问题并且你不需要执行变量值替换(如@ choroba'答案),但只将$
字符附加到已知变量,如果%variables_hash
不是很长,如何将%variables_hash
的所有键与|
字符连接起来,以获得匹配所有已知变量的正则表达式?
my %variable_hash = (
varA => 1,
# varB => 1, # commented out to check that it will not be replaced
varC => 1,
);
my $entire_line = "if varC > 0: varB = varC + 2;";
my $key_regex = join('|', map { quotemeta $_; } keys %variable_hash);
# $key_regex will contain "varA|varC"
$entire_line =~ s/\b($key_regex)\b/\$$1/g;
# prefix all matching substrings with $ character
print "$entire_line\n";
另请查看@ choroba的答案。