如何评估从一个字符串表达式链,在Perl?
-
22-07-2019 - |
题
我真的不知道该怎么称呼这些类型的表达式,这样的例子会更容易些......
有没有在Perl的方式来评估像a < b <= c
表达式?我有一个配置文件,允许用户为某些操作提供条件表达式。而非分裂条件成两个部分(如我通常会在代码做),想我如果可能代表这种方式,
解决方案
这是在Perl 6的未来,肯定的。但不幸的是,我不认为这是在Perl 6的东西被Perl 5.10借来的。
其他提示
链式在Perl 6的特征的比较。
现在,将它可以创建一个菊花链子程序Perl的5.x的?这是一个有趣的问题......
这是略少可读性,但实现你想要什么:a < b && b <= c
如其他人提及的Perl5的不(还)具有链比较。
然而,如果你解析“A
use strict;
use warnings;
use 5.010;
my ($a, $b, $c) = (10, 20, 30);
say 'Its true!' if comparison( $a, '<', $b, '<=', $c );
sub comparison {
my $left = shift;
while (my $cmp = shift) {
my $right = shift;
compare( $cmp, $left, $right ) or return;
$left = $right;
}
return 1;
}
sub compare {
my $op = shift;
given ($op) {
when ( '<' ) { return $_[0] < $_[1] }
when ( '<=' ) { return $_[0] <= $_[1] }
default { die "Invalid comparison operator" }
}
}
它只是一个基本的例子(即不完整的,没有错误检查),但我觉得你的想法。
,你会发现这样的事情已经在 CPAN
。像 Parse::RPN
也许有用的构建模块。
现在,如果你的问题是如何从字面上分析a < b <= c
然后就是鱼的另一壶!
/ I3az /
忽略任何输入验证或暂时最终比较的执行,下面的代码(或它的一个微小变化)应该能够重写语句:
sub rewrite {
my $str = shift;
my $ops = join "|" => qw/ < > <= >= == != /;
1 while $str =~ s/ ($ops) \s* (\w+?) \s* ($ops) /$1 $2 && $2 $3/xg;
$str
}
print rewrite "a < b < 5 < c != d";
# prints a < b && b < 5 && 5 < c && c != d