Ronen Kfir <mailto:[EMAIL PROTECTED]> asked:
> The following script meant to calculate simple math drills, 
> such as 5 *
> 9 or 4 + 3, written in one line. What I cannot comprehend is the lines
> marked with ---. What do they do? Why is there a "0 < index..." 

That looks like somebody wrote a C program in Perl. (S)he
is using (r)index and substr to pluck apart the the input.

The "0 < index ..." construct is basically there to determine
wether the operator was a + or a *. Writing the constant on
the left hand in a comparison is a fairly common way to find
a missing "=" in an numerical eqality check - if you want to
check wether $a is 0, then the typo "0 = $a" will produce an
error, while the assignment "$a = 0" will most likely be
a nasty bug.

> $line = <STDIN>;
> chomp $line;
> 
> $first_space = index($line , " ");
> $a = substr($line, 0, $first_space);
> 
> $last_space = rindex($line , " ");
> $b = substr($line, $last_space+1);
> 
> 
> --- if (0 < index($line, "*")) {
>     print $a * $b, "\n";
> }
> --- if (0 < index($line, "+")) {
>     print $a + $b, "\n";
> }

Off the top of my head I'd suggest a different approach:

#!/usr/bin/perl -w

use strict;

# I like to read my test cases from the file itself
while( defined( my $line = <DATA> ) ){
        # while has put the line in $_ for us
        # this is also the variable that many
      # functions act on by default

        # remove all whitespace from the line   
        $line =~ s/\s//g;

        # see if the line we read matches our
        # pattern. If it does, we print the
        # formula and the result.

        # The Pattern assigns the following
        # variables if it matches:
        # $1 = the whole shebanf
        # $2 = left operand ( optional minus, at least one digit
        # $3 = operator (one of +, -, *, / )
        # $4 = right operand
        if( $line =~ /((-?\d+)([-+*\/])(-?\d+))/ ){
                print "$2 $3 $4 = " . eval( $1 ) . "\n";
        }
}
__DATA__
1+1
 3 + 7
2 * 3
6 - 8

If you like oneliners, you could always write that as

        perl -ne 's/\s//g;/((-?\d+)([-+*\/])(-?\d+))/&&print "$2 $3 $4 =
".eval($1)."\n"'


HTH,
Thomas

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

Reply via email to