首页 > 解决方案 > 在 Perl 中将 strnig 作为计算器程序的输入

问题描述

我是 Perl 的新手,我正在尝试创建一个简单的计算器程序,但规则与普通数学不同。所有运算都具有相同的功率,数学问题必须从左到右解决。这是一个例子:

123 - 10 + 4 * 10 = ((123 - 10) + 4) * 10 = 1170

8 * 7 / 3 + 2 = ((8 * 7) / 3) + 2 = 20.666

所以在第一种情况下,用户需要输入一个字符串:123 - 10 + 4 * 10。我该如何处理这个任务?如果这是一个笼统的问题,我很抱歉,但我不知道如何开始。我需要柜台吗?像 - 字符串的每个第二个字符是一个运算符,而两侧的两个是数字。

标签: stringperlinputcalculator

解决方案


恐怕我很懒,所以我会用正则表达式解析并在解析时进行处理。

#!/usr/bin/env perl

#use Data::Dumper;
use Params::Validate (':all');
use 5.01800;
use warnings;

my $string=q{123 - 10 + 4 * 10};

my $result;
    sub fee {
        my ($a)=validate_pos(@_,{ type=>SCALAR });
        #warn Data::Dumper->Dump([\$a],[qw(*a)]),' ';
        $result=$a;
        };
    sub fi {
        my ($op,$b)=validate_pos(@_,{ type=>SCALAR},{ type=>SCALAR });
        #warn Data::Dumper->Dump([\$op,\$b],[qw(*op *b)]),' ';
        $result = $op eq '+' ? $result+$b :
                  $op eq '-' ? $result-$b :
                  $op eq '*' ? $result*$b :
                  $op eq '/' ? $result/$b :
                  undef;
        #warn Data::Dumper->Dump([\$result],[qw(*result)]),' ';
        };

$string=~ m{^(\d+)(?{ fee($1) })(?:(?: *([-+/*]) *)(\d+)(?{ fi($2,$3) }))*$};
say $result;

注意 (?{...}) 1的使用


推荐阅读