代码之家  ›  专栏  ›  技术社区  ›  jheddings

在Perl中,如何从字符串计算链式表达式?

  •  4
  • jheddings  · 技术社区  · 15 年前

    我真的不确定这些类型的表达式叫什么,所以举个例子会更容易。。。

    在Perl中有没有一种方法可以计算如下表达式 a < b <= c ? 我有一个配置文件,允许用户为某些操作提供条件表达式。如果可能的话,我想用这种方式表示它,而不是像我在代码中通常做的那样将条件分成两部分。

    5 回复  |  直到 15 年前
        1
  •  2
  •   AmbroseChapel    15 年前

    当然,这是在Perl6中实现的。但不幸的是,我不认为这是Perl5.10借用Perl6的东西之一。

        3
  •  0
  •   glenn jackman    15 年前

    虽然可读性稍差,但可以满足您的需要: a < b && b <= c

        4
  •  0
  •   draegtun    15 年前

    正如其他人所提到的,Perl5(还)没有链式比较。

    但是,如果您正在解析“a<b<=c“从一个配置文件,只是想评估它,然后也许这可能是你的转向后?

    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/

        5
  •  0
  •   Eric Strom    15 年前

    暂时忽略任何输入验证或最终比较的执行,以下代码(或其微小变化)应该能够重写您的语句:

    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