逆ポーランド計算機

Web連載の準備中に考えていることをマネして、30分で何かを作ってみよう。

というわけで、30分で作ったPerlによる逆ポーランド記法計算機。5分ぐらいオーバしたけど。

使い方:

$ rpn "1 2 +"
3

$ rpn "2 1 - 10 *"
10

$ rpn "1 A +"
A is not number/operator. at rpn line 26.

$ rpn "1 10"
stack is not sigle: 1 10 at rpn line 30.
#!/opt/local/bin/perl # -*- perl -*-
use strict;
@ARGV >= 1 or die "too few argument";
my %op = ( 
    '+' => sub($$){ @_[0] + @_[1]; } ,
    '-' => sub($$){ @_[0] - @_[1]; } ,
    '*' => sub($$){ @_[0] * @_[1]; } ,
    '/' => sub($$){ @_[0] / @_[1]; } ,
    );

my @stack;
my @tokens = split ' ',$ARGV[0];

while(my $token = shift @tokens){
    if(exists $op{$token}){
	my $f = $op{$token};
	my $b = pop(@stack);
	my $a = pop(@stack);
	push(@stack,&$f($a,$b));
    }elsif($token =~ /\A\d+\Z/){
	push(@stack,$token);
    }else{
	die "$token is not number/operator.";
    }
}
@stack == 1 or die "stack is not sigle: @stack";
print $stack[0],"\n"

@_とかをうまく使うと、$tokenとか@tokensとかを消せるんだろうなぁ。