2009年4月15日星期三

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

有一處筆誤...

$a =~ s/(?<![\+\-\*\/])\(([\d\.]+)\)/$1/g;
改成
$a =~ s/(?<![\+\-\*\/])\(([\d\.]+)\)/\*$1/g;

針對如
&comp1 ("1+1(2)");
&comp1 ("1(2)");
的情況

On 4月15日, 下午8时24分, Anthony WU <anthonywu...@gmail.com> wrote:
> 用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: 独断的天蝎 <nin...@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 访问该论坛
-~----------~----~----~----~------~----~------~--~---

没有评论: