我真的不知道该怎么称呼这些类型的表达式,这样的例子会更容易些......

有没有在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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top