跟踪比赛并检查状况

时间:2014-09-26 07:21:42

标签: regex perl

我有$entire_line = "if varC > 0: varB = varC + 2"

我希望我的正则表达式在varC

中找到以下内容:varBvarB$entire_line

然后需要检查这些匹配以查看它们是否存在于HashMap中。如果是这样,则应在比赛中附加$

因此输出应为:

"if $varC > 0: $varB = $varC + 2"

注意:02未显示在HashMap

目前,我有:

$entire_line =~ s/(\w+)/\$$1/g if (exists($variable_hash{$1}));

但是,由于$1中的exists($variable_hash{$1})未引用之前的正则表达式,因此无法正常工作:$entire_line =~ s/(\w+)/\$$1/g

有没有正确的方法来解决这个问题?

感谢您的帮助。

2 个答案:

答案 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的答案。