diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-12-15 19:30:41 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-15 19:30:41 +0000 |
| commit | 00df103b9caa3f0eccbde85603bd40613641402c (patch) | |
| tree | 26b02850f083431ebe435c89313441ac24f5c45b | |
| parent | 0a84b8990b9a144bb82f6a8745e8315bbc0cd0fe (diff) | |
| parent | ac3232563d692f76a1493880b4bd4b5f3112be30 (diff) | |
| download | perlweeklychallenge-club-00df103b9caa3f0eccbde85603bd40613641402c.tar.gz perlweeklychallenge-club-00df103b9caa3f0eccbde85603bd40613641402c.tar.bz2 perlweeklychallenge-club-00df103b9caa3f0eccbde85603bd40613641402c.zip | |
Merge pull request #5379 from wlmb/challenges
Add try/catch to survive mistakes and rename variables
| -rwxr-xr-x | challenge-143/wlmb/perl/ch-1.pl | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/challenge-143/wlmb/perl/ch-1.pl b/challenge-143/wlmb/perl/ch-1.pl index cc18d4ac91..80c20d3932 100755 --- a/challenge-143/wlmb/perl/ch-1.pl +++ b/challenge-143/wlmb/perl/ch-1.pl @@ -6,33 +6,42 @@ use v5.12; use warnings; use Scalar::Util qw(looks_like_number); +use Try::Tiny; my $original_string; +my $previous; my $current; -my $next; +my $token; foreach (@ARGV){ - my $original_string=$current=$_; - token(); - my $result=expression(); - say "$original_string=$result"; + try { + $original_string=$previous=$current=$_; + token(); + my $result=expression(); + die "Extra characters: $previous\n" if defined $token->[0]; + say "$original_string=$result"; + } + catch { + warn $_; + }; } sub token { - $next=[$1,$1], return if $current=~s{^\s*([()*/+-])}{}; # symbol - $next=['N',$1], return + $previous=$current; + $token=[$1,$1], return if $current=~s{^\s*([()*/+-])}{}; # symbol + $token=['N',$1], return if $current=~s{^\s*([^()*/+\-\t\n ]*)}{} and looks_like_number($1); # number? - $next=[undef,undef], return if $current=~/^\s*$/; # nothing - die "Unrecognizable input: $current"; + $token=[undef,undef], return if $current=~/^\s*$/; # nothing + die "Unrecognizable input: $previous\n"; } sub expression { my $result=term(); while(1){ - my $op=$next->[0]; - last unless defined $op && $op=~m{[+-]}; - token(); - $result+=term(),next if $op eq '+'; - $result-=term(),next if $op eq '-'; + my $op=$token->[0]; + last unless defined $op && $op=~m{[+-]}; + token(); + $result+=term(),next if $op eq '+'; + $result-=term(),next if $op eq '-'; } return $result; } @@ -40,24 +49,25 @@ sub expression { sub term { my $result=simple(); while(1){ - my $op=$next->[0]; - last unless defined $op && $op=~m{[*/]}; - token(); - $result*=simple(),next if $op eq '*'; - $result/=simple(),next if $op eq '/'; + my $op=$token->[0]; + last unless defined $op && $op=~m{[*/]}; + token(); + $result*=simple(),next if $op eq '*'; + $result/=simple(),next if $op eq '/'; } return $result; } sub simple { - my $op=$next->[0]; - my $val=$next->[1]; - die "Unrecognized expression: $current" unless defined $op && $op=~/[-(N]/; + my $op=$token->[0]; + my $val=$token->[1]; + die "Unrecognized expression: $previous\n" unless defined $op && $op=~/[-+(N]/; token(); - return -simple() if $op eq '-'; - return $val if $op eq 'N'; - my $result=expression(); - $op=$next->[0]; - die "Unbalanced parenthesis: $current" unless defined $op and $op eq ')'; + return -simple() if $op eq '-'; # unary - + return simple() if $op eq '+'; # unary + + return $val if $op eq 'N'; # number + my $result=expression(); # parenthesized expression + $op=$token->[0]; # closing parenthesis should follow + die "Unbalanced parenthesis: $previous\n" unless defined $op and $op eq ')'; token(); return $result; } |
