35 lines
738 B
Plaintext
35 lines
738 B
Plaintext
|
|
|
|
###
|
|
### rpn_ifelse
|
|
###
|
|
|
|
## Chapter 2 section 2
|
|
|
|
my $result = evaluate($ARGV[0]);
|
|
print "Result: $result\n";
|
|
|
|
sub evaluate {
|
|
my @stack;
|
|
my ($expr) = @_;
|
|
my @tokens = split /\s+/, $expr;
|
|
for my $token (@tokens) {
|
|
if ($token =~ /^\d+$/) { # It's a number
|
|
push @stack, $token;
|
|
} elsif ($token eq '+') {
|
|
push @stack, pop(@stack) + pop(@stack);
|
|
} elsif ($token eq '-') {
|
|
my $s = pop(@stack);
|
|
push @stack, pop(@stack) - $s
|
|
} elsif ($token eq '*') {
|
|
push @stack, pop(@stack) * pop(@stack);
|
|
} elsif ($token eq '/') {
|
|
my $s = pop(@stack);
|
|
push @stack, pop(@stack) / $s
|
|
} else {
|
|
die "Unrecognized token `$token'; aborting";
|
|
}
|
|
}
|
|
return pop(@stack);
|
|
}
|