From: Paul Johnson <[EMAIL PROTECTED]>
> On Sun, Jan 19, 2003 at 06:44:31PM +0100, Jacques Lederer wrote:
> > When you write
> >
> > $calc=3+5-2;
> > print $calc."\n";
> >
> > you get 6. (number, not the string "3+5-2")
> >
> > When you write
> >
> > while (<STDIN>) {
> >     $calc=$_;
> >     print $calc."\n";
> >     last;
> > }
> >
> > if you run that last one and type 3+5-2, you get 3+5-2.(string
> > "3+5-2", not the number 6)
> >
> > Why is it so? And how can I get it to calculate the thing?
> 
> The input you get is a string.  If you want to treat it as a Perl
> expression you need C<eval>.
> 
>   $calc = eval;
> 
> This does what you want, plus a lot more.
> 
> Be careful not to type "unlink <*>" for example.

I guess that if you only want to evaluate some basic math there it'll 
be easiest to do this:

        $calc = <STDIN>;
        # remove everything except numbers, dots, +, -, *, / and ( )
        $calc =~ tr{0-9+\-*/.() }{}dc;
        $result = eval $calc;
        die "Incorrect expression: $calc\n\t$@\n"
                if $@;
        print "Result: $result\n";

If you want to warn the user that the expression contained something 
you did not want you can do this:

        $calc = <STDIN>;
        # we have to strip the newline at the end of the entered data!
        chomp($calc); 
        # remove everything except numbers, dots, +, -, *, / and ( )
        if ($calc =~ tr{0-9+\-*/.() }{}dc) {
                die "You can only enter numbers, +, -, *, /, ., ( and )\n";
        }
        $result = eval $calc;
        die "Incorrect expression: $calc\n\t$@\n"
                if $@;
        print "Result: $result\n";

HTH, Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to