在确定属性是否能够与我正在定义的项目相关联时,我需要从我引用的数据库中解码逻辑。数据库使用标准逻辑流程和重要性顺序。我需要能够确定从数据库中提取的字符串中的嵌套条件语句。例如:
$val = "(red && (blue || yellow)) && black";
我将从数据库中提取的字符串类似于:
$pull = "red.yellow.black";
我将$pull
上的.
分开并将值存储在数组中,然后验证每个值都在从$val
字符串生成的数组中。我在确定如何解压缩嵌套逻辑的最佳方法时遇到麻烦。最初,我考虑只使用正则表达式,然后删除已评估的逻辑部分,如下所示:
($eval) = $val =~ /.*\((.*)?\)/; $val =~ s/(.*)\((.*)?\)(.*)/$1 $2/;
如果我在while ($val =~ /\(/)
循环中执行此操作,则可能会将提取的逻辑堆栈到数组中,并评估每个元素中的逻辑表达式,以确定我所评估的项目的每个条件是否为真,但是有一些问题我的regexp错误,导致序列失败。 ?
并没有我想的那么懒,显然...
my $val = "(red && (blue || yellow)) && black";
my $pull = "red.yellow.black";
my @stack = ();
until ($val !~ /\(/) {
my ($eval) = $val =~ /.*\((.*)?\)/;
push(@stack, $eval);
print "$eval\n";
$val =~ s/(.+)\((.*)?\)(.*)/$1 $2/;
print "$val\n";
}
如果我只是在perl shell中运行序列,并提供一些调试信息,我会得到:
[bin]$ perl -e 'my $val = "((red && (blue || yellow) && black)"; my $pull = "red.yellow.black"; my @stack = (); until ($val !~ /\(/) { my ($eval) = $val =~ /.*\((.+)?\).?/; push(@stack, $eval); print "EVAL: $eval\n";$pause = <STDIN>;$val =~ s/(.*)\((.*)?\)(.*)/$1 $2/;print "VAL: $val\n"; }'
EVAL: blue || yellow) && black
VAL: ((red && blue || yellow) && black
EVAL: red && blue || yellow
VAL: ( red && blue || yellow
EVAL:
任何对我做错事的投入将不胜感激,任何对效率的改进将不胜感激! TIA
更新:好的,所以我只是把整个事情都这样哑了下来。我失去了一些操作顺序,但是如果我分别评估每个语句,则只要其中一个条件被破坏,我都会进行处理,并能够对信息进行相应的处理。我将在下面扩展的代码。这只会返回表达式的各个组成部分。我不喜欢将所有括号都连接到第一个元素中,但是我想它仍然可以从根本上起作用。
my $val = "(red && (blue || yellow)) && black";
$val =~ s/\s+//g;
my @chars = ();
my @ops = ();
while ($val) {
my ($char) = $val =~ /(.)/;
$val =~ s/.//;
push @chars, $char;
}
my $index = 0;
foreach my $char (@chars) {
if ($char =~ /\(/) {
$index++;
} elsif ($char =~ /\)/) {
$index--
}
#assign the character to the index.
$ops[$index] .= $char;
}
s/[()]//g for @ops;
print " @ops\n";
输出:
[/bin]$ perl decode_logic.pl
&&black red&& blue||yellow