Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

using pop and shift to find the sum of an array

by perlguru22 (Acolyte)
on Sep 22, 2012 at 05:45 UTC ( #995046=perlquestion: print w/ replies, xml ) Need Help??
perlguru22 has asked for the wisdom of the Perl Monks concerning the following question:

How can you find the sum of an array using just shift and pop?
#! usr/bin/perl @nums = (1,2,3,4); $s = shift@nums; \\ I know that gives $s 1 $p = pop@nums; \\ This gives $p 4 $sum += $_ for @nums; print "$sum";
I tried using a for loop but I don't think that worked either.

Comment on using pop and shift to find the sum of an array
Download Code
Re: using pop and shift to find the sum of an array
by 2teez (Priest) on Sep 22, 2012 at 06:14 UTC

    How can you find the sum of an array using just shift and pop?
    Please, check your last post. Help with arrays
    Moreover, your code die with several errors. Please, use warnings and strict
    Comments in Perl is started with #
    Also check the following Up:
    push, pop, shift, unshift

    If you tell me, I'll forget.
    If you show me, I'll remember.
    if you involve me, I'll understand.
    --- Author unknown to me
Re: using pop and shift to find the sum of an array
by Athanasius (Monsignor) on Sep 22, 2012 at 07:39 UTC
    How can you find the sum of an array using just shift and pop?

    There are two key points to grasp:

    1. shift not only gives the vaue of the first element of the array, it also removes it, reducing the size of the array by one. Likewise, pop not only gives the value of the last element of the array, it also removes, it, reducing the size of the array by one.

    2. A while loop continues until its condition becomes false. while ( @nums ) { ... } contines to loop until @nums is false. When does this happen? Well, in this case @nums is in scalar context, so its value is the size of the array. As long as the array contains elements, this size is greater than zero, and Perl interprets any non-zero numerical value as “true”. But when the last element is removed, the size of the array falls to zero, a value which Perl interprets as “false”, so the loop ends.

    Put these two points together, and the question is easily solved.

    Hope that helps,

    Athanasius <°(((><contra mundum

Re: using pop and shift to find the sum of an array
by tobyink (Abbot) on Sep 22, 2012 at 10:52 UTC

    The usual and most readable way is this:

    use v5.14; my @nums = (1,2,3,4); say do{local($_,$.);$_+=pop(@nums)*!!++$. while@nums;$_/$.};
    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
Re: using pop and shift to find the sum of an array
by johngg (Abbot) on Sep 22, 2012 at 12:25 UTC

    You can randomly use pop and shift to remove elements one at a time from either end of your array and add them to the sum, doing this in a loop while there are still elements in the array. However, this obviously destroys your array.

    $ perl -Mstrict -Mwarnings -E ' > my @arr = ( 1 .. 10 ); > my $sum; > $sum += int rand 2 ? shift @arr : pop @arr while @arr; > say $sum; > say qq{-> @arr <-};' 55 -> <- $

    If, on the other hand, you wish to preserve your array, do the same thing in an on-the-fly subroutine with your array as the argument, which is passed into the subroutine as the @_ array (see perlvar and perlsub). The pop and shift functions inside a subroutine operate on @_ by default, leaving your @arr array untouched.

    $ perl -Mstrict -Mwarnings -E ' > my @arr = ( 1 .. 10 ); > my $sum = sub { > my $sum; > $sum += int rand 2 ? shift : pop while @_; > return $sum; > }->( @arr ); > say $sum; > say qq{-> @arr <-};' 55 -> 1 2 3 4 5 6 7 8 9 10 <- $

    I hope this is helpful.

    Update: Clarified the wording a little.

    Cheers,

    JohnGG

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://995046]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (5)
As of 2014-09-19 05:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (129 votes), past polls