Hi Paul
This is pure educational. I want to understand how this all works.
So after follow your comments my script.pl looks like this:
!/usr/bin/perl
use strict;
use warnings;
require 'lib.pl';
my @userArray = <STDIN>;
my $sum = sumIt(@userArray);
print $sum;
AND my library like this:
sub sumIt(
my $total;
$total += $_ for @_;
warn "@_ was empty, total undefined!\n" if !defined $total;
}
sub avg(@)
{
my @arr = @_;
my $arrSize = scalar(@arr);
(last index). Double check
return sumIt(@arr) / @arr;
}
1;
Is this correct now? If so, I don't know how to use it. What command should
I use to try this out?
Thanks
Amichai
P.S. echo 1234 | ./script.pl doesn't do anythign exciting.
On 8/3/07, Paul Lalli <[EMAIL PROTECTED]> wrote:
>
> On Aug 3, 6:03 am, [EMAIL PROTECTED] (Amichai Teumim)
> wrote:
> > After some friendly input from yitzle I might have moved further with
> > my library.
> >
> > This is my script.
> >
> > script.pl
> >
> > #!/usr/bin/perl
>
> Get into the habbit of using
> use strict;
> use warnings;
> in all of your scripts. You will be greatful you did in the long
> run. With such small libraries/scripts as these, it's not as
> important as mistakes are far easier to debug, but getting into the
> habbit now will save you endless amounts of pain later on in your
> programming life.
>
>
> > #require 'lib.pl';
> >
> > @userArray = <STDIN>;
>
> my @userArray = <STDIN>;
> because 'use strict;' forces you to declare your variables.
>
> > $sum = sumIt(@userArray);
>
> my $sum = sumIt(@userArray);
>
> Out of curiousity, is this a learning excercise, or do you intend to
> actually use this? If the latter, you should know that this wheel has
> already been invented. The standard List::Util module provides a
> sum() function:
>
> use List::Util qw/sum/;
> my $sum = sum(@userArray);
>
> > print $sum;
> >
> > And this is my library according to yitzle:
> >
> > sub sumIt(@)
>
> 1) Don't use prototypes. They don't work like anyone expects them to.
> 2) This particular prototype is double-plus useless. It says that
> this function takes a list of values. That's what all subroutines
> without prototypes take. That (@) is doing nothing at all.
>
> > {
> > my $total = 0;
> > $total += $_ for (@_);
> > return $total; # This line might not be needed...
>
> Not needed, but again a good habbit to get into. Never rely on the
> "blocks return the last evaluated value" feature of Perl. Return
> explicitly, so that you don't FUBAR things when you later go back to
> modify your code. For example, if you had just written:
>
> sub sumIt {
> my $total;
> $total += $_ for @_;
> }
>
> and then later you wanted to add a warning if there hadn't been
> anything in @_:
>
> sub sumIt {
> my $total;
> $total += $_ for @_;
> warn "@_ was empty, total undefined!!\n" if !defined $total;
> }
>
> Now you've FUBARed your script. The last value evaluated will either
> be the (!defined $total), or the (warn "..."). It won't be $total.
> If you'd started with the explicit return statement, you'd save
> yourself this problem.
>
> >
> > }
> >
> > sub avg(@)
> > {
> > my @arr = @_;
> > my $arrSize = @arr; # scalar(@arr) is the array size - or one less
> > (last index). Double check
>
> scalar(@arr) is the size of the array
> $#arr is the last index of the array.
>
> USUALLY it is a true statement that scalar(@arr) == $#arr + 1;
> However, this is not necessarily the case, as in Perl you can actually
> futz with the starting index of arrays using the $[ variable. You
> should never do that, of course, but you also shouldn't assume that no
> one in your program has.
>
> > return simIt(@arr) / $arrSize;
>
> Well first, assuming you meant sumIt, not simit, there's no reason to
> create a new variable just to store the size of the array. Just use
> the array in a scalar context:
>
> return sumIt(@arr) / @arr;
>
> >
> > }
> >
> > 1;
> >
> > Now either this is wrong or I have no idea how to use it.
> >
> > With STDIN I need to do something like this (right?):
> >
> > ./script.pl | echo 1234
>
> That says you want to run script.pl and send the output of script.pl
> to the process "echo 1234". You actually want the other way around:
>
> echo 1234 | ./script.pl
>
> > Or is this nonsensical? Very very new to Perl.
>
> Well, this bit in any event has nothing to do with Perl. Input/Output
> redirection is a feature of the shell, not of Perl.
>
> Paul Lalli
>
>
> --
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> http://learn.perl.org/
>
>
>