Ron Smith wrote:
> Hi all,

Hello,

> This page accepts a series of numbers, separated by spaces, and gives
> the values listed bellow.
> 
> I'm getting the following error, but don't see why. Can anyone spot
> my error?
> 
> Please, enter numbers separated by spaces only!: Bad file descriptor
> at E:/www/cgi-bin/pg93ex3.11SeriesOfNumbers.pl line 14.
> 
> I've narrowed the problem down to the "if" block (the regex), I'd like
> to accept numbers and spaces only. Here's the code:
> 
> #!E:/www/perl/bin/perl.exe
> 
> use strict;
> use warnings;
> use CGI qw( :standard );
> use CGI::Carp qw( fatalsToBrowser );
>  print header();
>  
>  my $userIn = param( "textfield" );
>  
> if ( $userIn =~ /^(\d+|\s*)$/ ) {
>  $userIn = $1;
> } else {
>  die "Please, enter numbers separated by spaces only!: $!";

Your problem is that you are using the $! variable:

perldoc perlvar
[snip]
       $!      If used numerically, yields the current value of the C "errno"
               variable, or in other words, if a system or library call fails,
               it sets this variable.  This means that the value of $! is
               meaningful only immediately after a failure:


But you are using it for a pattern match failure which is neither a system nor
a library call.


> }
> 
> my @numbers = split( / /, $userIn );

I would write that as:

my @numbers = $userIn =~ /\d+/g;
@numbers or die "Please, enter numbers separated by spaces only!";


> my $total = scalar( @numbers );

"my $total =" forces scalar context so using the scalar() function is redundant.

> my @sorted = sort( @numbers );
> my $smallestNum =   @sorted[0];
> my $largestNum = @sorted[-1];

perldoc -q difference
Found in /usr/lib/perl5/5.8.6/pod/perlfaq4.pod
       What is the difference between $array[1] and @array[1]?

       The former is a scalar value; the latter an array slice, making it a
       list with one (scalar) value.  You should use $ when you want a scalar
       value (most of the time) and @ when you want a list with one scalar
       value in it (very, very rarely; nearly never, in fact).

       Sometimes it doesn't make a difference, but sometimes it does.  For
       example, compare:

           $good[0] = 'some program that outputs several lines';

       with

           @bad[0]  = 'same program that outputs several lines';

       The "use warnings" pragma and the -w flag will warn you about these
       matters.


Or you could write those three lines like this:

my ( $smallestNum, $largestNum ) = sort @numbers;

But since you are sorting numbers, you probably want to do a numeric sort to
get the correct numbers:

my ( $smallestNum, $largestNum ) = sort { $a <=> $b } @numbers;


And of course you can do that more efficiently using a for loop:

my ( $smallestNum, $largestNum ) = @numbers[ 0, 0 ];
for ( @numbers ) {
    $smallestNum = $_ if $smallestNum > $_;
    $largestNum  = $_ if $largestNum  < $_;
    }


>  my $sum = 0;
>  foreach ( @numbers ) {
>   $sum += $_;
> }
> 
> my $average = ( $sum / $total );

You could just use the array there as a mathematical expression forces scalar
context:

my $average = ( $sum / @numbers );




John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to