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/ > > >