0

我当前的脚本将采用一个表达式,例如:

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用于防止部分替换。按长度对键进行排序并不能解决问题,因为某些变量没有被替换(caab上面的示例中)。

4

0 回答 0