逆ポーランド計算機
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とかを消せるんだろうなぁ。