用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 访问该论坛
-~----------~----~----~----~------~----~------~--~---