将条件运算符解析为字符串并将其用作条件运算符

时间:2017-04-07 13:11:51

标签: string perl operators

my $line ="Corner:Default,Output:fall_delay_slew_1,Mean=34.97p,Std-      dev=1.767p,Min=30.02p,Max=39.71p";    #added semicolon
my $my_value="COND = Mean > 3"; #this has come from the parsed file.
$my_value =~ m/(\w+)\s*(.)\s*(\d+)/;
my $cond=$1;
my $sign=$2;
my $value=$3;
print "DEBUG:cond is $cond and sign $sign and value $value \n";
if ( $line =~ m/$cond=(.*?),/) {
if ( "$value $sign $1" ) {
    print "$value is $sign than $1\n";
} else {
    print "actual value is less\n";
 }
}

如果你在上面看到if语句总是求值为true。

我如何解决这类问题,即$sign = "<"(可以是任何运营商) 但是当我想将它与$value进行比较时,我想让它作为一个 运算符而不是字符串。

1 个答案:

答案 0 :(得分:0)

您愿意做的事情(执行字符串作为代码)可以完成 eval。这并不意味着它是最合适的做法 它虽然。只有在您保证输入安全并检查时才这样做 它

更好的方法是检查操作员自己并确定 如何进行。如果您使用最新的Perl版本,given-when 功能可以很方便:

use feature 'switch'; # not needed if you already use 5.010 or greater

given ($sign) {
    when ('<') { say "$cond less than $value" }
    when ('>') { say "$cond greater than $value" }
    default {
        warn "unrecognized operator `$sign'\n";
        # decide what to do
    }
}