我当前的脚本将采用一个表达式,例如:
my $expression = '( a || b || c || ab || ca)';
并使用 sub/replace 遍历输入的每个布尔组合,如下所示:
my $keys = join '|', keys %stimhash;
$expression =~ s/($keys)\b/$stimhash{$1}/g;
在上面的例子中,假设:
a => 0, b => 1, c => 0
表达式应变为:
( 0 || 1 || 0 || ab || ca )
这很好用。
但是,我想允许变量(也在 中%stimhash
)包含一个标签,*.
my $expression = '( a* || b* || c* || ca || ab )';
此外,打印 stimhash 的键返回:
a*|b*|c*
它没有用额外的特殊字符正确替换/替换,*.
它给出了这个警告:
Use of uninitialized value within `%stimhash` in substitution iterator
我尝试使用quotemeta()
,但到目前为止没有很好的效果。它会丢弃这些值。替换后的示例如下所示:
( * || * || * || ca || ab )
代替:
( 0 || 1 || 0 || ca || ab )
如您所见,/b
用于防止部分替换。按长度对键进行排序并不能解决问题,因为某些变量没有被替换(ca
在ab
上面的示例中)。