-delete $vals{humn};
-$names{humn} = 'xx';
-
-while (!defined $vals{root}) {
- my $added;
- for my $n (keys %names) {
- no warnings;
- next if defined $vals{$n};
- my $e = $names{$n};
- my $d = 1;
- for my $v (keys %vals) {
- $e =~ s/$v/$vals{$v}/g;
- $names{$n} = $e;
- }
- next if $e =~ /[a-z]/;
-
- eval "\$vals{$n} = $e";
- # say "set \$vals{$n} to $vals{$n}" unless $@;
- $added = 1;
+sub walk($var) {
+ return $val{$var} if defined $val{$var};
+ return undef if !defined $expr{$var};
+ my ($arg1, $op, $arg2) = @{ $expr{$var} };
+ my $val1 = walk($arg1);
+ my $val2 = walk($arg2);
+ return undef if !defined $val1 || !defined $val2;
+ if ($op eq '+') {
+ return $val{$var} = $val1 + $val2;
+ } elsif ($op eq '-') {
+ return $val{$var} = $val1 - $val2;
+ } elsif ($op eq '*') {
+ return $val{$var} = $val1 * $val2;
+ } elsif ($op eq '/') {
+ return $val{$var} = $val1 / $val2;