2009年4月15日星期三

[PerlChina] Re: 求助:如何将字符串自动执行四则运算?

用eval總覺有點不安全……
剛用正則寫了一個,大多情況下都正常運行

use strict;
$\ = "\n";

&comp1 ("(4*3*(4*3))+5-1");
&comp1 ("(4*3)+5-1");
&comp1 ("(4*3)+(4*3)");
&comp1 ("((4*3)+4)*3");
&comp1 ("1*");
&comp1 ("1/");
&comp1 ("*1");
&comp1 ("/1");
&comp1 ("+1");
&comp1 ("-1");
&comp1 ("1+");
&comp1 ("1-");

&comp1 ("(4*3+4)*3");
&comp1 ("(4*3+4/8)*3");

exit(1);

sub comp1
{
    my $a = shift;
    print '-' x 32;
    print $a;
    $a =~ tr/[0-9\.\+\-\*\/\(\)]//dc;
    printf ("\=%s\n", $a);
    while ($a !~ /^[\d\.]*$/)
    {
        if ($a =~ /(\(([\d\.]+)([\+\-\*\/])([\d\.]+)\))/)
        {
            my $ref = &comp2 ($2, $3, $4);
            $a =~ s/\Q$1\E/\($ref\)/g;
        } elsif ($a =~ /(([\d\.]+)([\*\/])([\d\.]+))/) {
            my $ref = &comp2 ($2, $3, $4);
            $a =~ s/\Q$1\E/$ref/g;
        } elsif ($a =~ /(([\d\.]+)([\+\-])([\d\.]+))/) {
            my $ref = &comp2 ($2, $3, $4);
            $a =~ s/\Q$1\E/$ref/g;
        }
        if ($a =~ /^[\*\/]/ || $a =~ /[\*\/]$/)
        {
            $a = "ERROR";
            last;
        }
        if ($a =~ /^\-[\d\.]+/)
        {
            last;
        }
        $a =~ s/^[\+]//;
        $a =~ s/[\+\-]$//;
        $a =~ s/(?<![\+\-\*\/])\(([\d\.]+)\)/$1/g;
        $a =~ s/\(([\d\.]+)\)/$1/g;
        printf ("\=%s\n", $a);
    }
    printf ("\=%s\n", $a);
}

sub comp2
{
    my ($n1, $n2, $n3) = @_;
    my $ref = '';
    if ($n2 eq '+')
    {
        $ref = $n1 + $n3;
    } elsif ($n2 eq '-') {
        $ref = $n1 - $n3;
    } elsif ($n2 eq '*') {
        $ref = $n1 * $n3;
    } elsif ($n2 eq '/') {
        $ref = $n1 / $n3;
    }
    return $ref;
 
}



-------- Original Message  --------
Subject: [PerlChina] Re: 求助:如何将字符串自动执行四则运算?
From: 独断的天蝎 <ningjj@gmail.com>
To: PerlChina Mongers 讨论组 <perlchina@googlegroups.com>
Date: 15/4/2009 17:21
use strict; my $a = "(4*3)+5-1";   print eval($a);   On 4月15日, 下午2时47分, dajiaolv <lilu...@gmail.com> wrote:   
各位大虾,请问如何让一个包含四则运算表达式的标量自动把值算出来,例如:  $a = "(4*3)+5-1"  如何让$a自动把值算出来。 注意:$a是变量,并不是固定的上述字符串。     
   

--  Best Regards, 	Anthony WU

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

没有评论: