aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Mochan <mochan@fis.unam.mx>2021-12-15 11:47:39 -0600
committerLuis Mochan <mochan@fis.unam.mx>2021-12-15 11:47:39 -0600
commit38ec22341cbc08f974963e5fff54f2f2298174a5 (patch)
tree743abf4d0fcccc1af352232117e8faedc4d47f30
parent0a84b8990b9a144bb82f6a8745e8315bbc0cd0fe (diff)
downloadperlweeklychallenge-club-38ec22341cbc08f974963e5fff54f2f2298174a5.tar.gz
perlweeklychallenge-club-38ec22341cbc08f974963e5fff54f2f2298174a5.tar.bz2
perlweeklychallenge-club-38ec22341cbc08f974963e5fff54f2f2298174a5.zip
Add try/catch to survive mistakes and rename variables
-rwxr-xr-xchallenge-143/wlmb/perl/ch-1.pl56
1 files changed, 32 insertions, 24 deletions
diff --git a/challenge-143/wlmb/perl/ch-1.pl b/challenge-143/wlmb/perl/ch-1.pl
index cc18d4ac91..96c3f72081 100755
--- a/challenge-143/wlmb/perl/ch-1.pl
+++ b/challenge-143/wlmb/perl/ch-1.pl
@@ -6,33 +6,41 @@
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();
+ 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 +48,24 @@ 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 ')';
+ $op=$token->[0];
+ die "Unbalanced parenthesis: $previous\n" unless defined $op and $op eq ')';
token();
return $result;
}