Bot-BasicBot-Pluggable-Module-Tools

 view release on metacpan or  search on metacpan

lib/Bot/BasicBot/Pluggable/Module/Maths.pm  view on Meta::CPAN

    foreach my $x (keys %digits) {
        $in =~ s/\b$x\b/$digits{$x}/g;
    }

    return if $in =~ /^\s*$/;
    return if $in =~ /(\d+\.){2,}/;

    my $loc = $in;
    while ($loc =~ /(exp ([\w\d]+))/) {
           my $exp = $1;
           my $val = exp($2);
           $loc =~ s/$exp/+$val/g;
    }

    while ($loc =~ /(hex2dec\s*([0-9A-Fa-f]+))/) {
            my $exp = $1;
            my $val = hex($2);
            $loc =~ s/$exp/+$val/g;
    }
        
    if ($loc =~ /^\s*(dec2hex\s*(\d+))\s*\?*/) {
            my $exp = $1;
            my $val = sprintf("%x", "$2");
            $loc =~ s/$exp/+$val/g;
     }
    my $e = exp(1);
    $loc =~ s/\be\b/$e/;

    while ($loc =~ /(log\s*((\d+\.?\d*)|\d*\.?\d+))\s*/) {
            my $exp = $1;
            my $res = $2;
            my $val;
            if ($res == 0) { 
                $val = "Infinity";
            } else { 
                $val = log($res); 
            }
            $loc =~ s/$exp/+$val/g;
     }

     while ($loc =~ /(bin2dec ([01]+))/) {
             my $exp = $1;
             my $val = join ('', unpack ("B*", $2)) ;
             $loc =~ s/$exp/+$val/g;
     }

     while ($loc =~ /(dec2bin (\d+))/) {
             my $exp = $1;
             my $val = join('', unpack('B*', pack('N', $2)));
             $val =~ s/^0+//;
             $loc =~ s/$exp/+$val/g;
     }

     $loc =~ s/ to the / ** /g;
     $loc =~ s/\btimes\b/\*/g;
     $loc =~ s/\bdiv(ided by)? /\/ /g;
     $loc =~ s/\bover /\/ /g;
     $loc =~ s/\bsquared/\*\*2 /g;
     $loc =~ s/\bcubed/\*\*3 /g;
     $loc =~ s/\bto\s+(\d+)(r?st|nd|rd|th)?( power)?/\*\*$1 /ig;
     $loc =~ s/\bpercent of/*0.01*/ig;
     $loc =~ s/\bpercent/*0.01/ig;
     $loc =~ s/\% of\b/*0.01*/g;
     $loc =~ s/\%/*0.01/g;
     $loc =~ s/\bsquare root of (\d+)/$1 ** 0.5 /ig;
     $loc =~ s/\bcubed? root of (\d+)/$1 **(1.0\/3.0) /ig;
     $loc =~ s/ of / * /;
     $loc =~ s/(bit(-| )?)?xor(\'?e?d( with))?/\^/g;
     $loc =~ s/(bit(-| )?)?or(\'?e?d( with))?/\|/g;
     $loc =~ s/bit(-| )?and(\'?e?d( with))?/\& /g;
     $loc =~ s/(plus|and)/+/ig;

     return if $loc !~ /^\s*[-\d*+\s()\/^\.\|\&\*\!]+\s*$/;
     return if $loc =~ /^\s*\(?\d+\.?\d*\)?\s*$/;
     return if $loc =~  /^\s*$/;
     return if $loc =~ /^\s*[( )]+\s*$/;
    
     $loc = eval($loc);
     # I just realised that I could have done this with Maths::Expression and these checks
     return unless  $loc =~ /^[-+\de\.]+$/;

     $loc =~ s/\.0+$//;
     $loc =~ s/(\.\d+)000\d+/$1/;
     $loc = "a number with quite a few digits..." if (length($loc) > 30);
     $orig =~ s!(^\s*|\s*$)!!g;
     return if ($orig eq $loc) || ($orig == $loc); 
     return $loc;
}

sub help {
    return "Commands: a maths expression";
}

1;

=head1 NAME

Bot::BasicBot::Pluggable::Module::Maths - evaluate arbitary maths expressions

=head1 SYNOPSIS

Does everything that C<Math::Expression> does;

=head1 AUTHOR

Simon Wistow, <simon@thegestalt.org>

based on code by Kevin Lenzo

=head1 COPYRIGHT

Copyright 2005, Simon Wistow

Distributed under the same terms as Perl itself.

=head1 SEE ALSO

L<Math::Expression>

=cut 



( run in 1.065 second using v1.01-cache-2.11-cpan-4991d5b9bd9 )