Welcome to the Monastery PerlMonks

### using pop and shift to find the sum of an array

by perlguru22 (Acolyte)
 on Sep 22, 2012 at 05:45 UTC 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.

Replies are listed 'Best First'.
Re: using pop and shift to find the sum of an array
by Athanasius (Chancellor) 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 2teez (Vicar) on Sep 22, 2012 at 06:14 UTC

How can you find the sum of an array using just shift and pop?
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 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 <- \$

Update: Clarified the wording a little.

Cheers,

JohnGG

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'

Create A New User
Node Status?
node history
Node Type: perlquestion [id://995046]
Approved by Corion
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (4)
As of 2018-05-25 19:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
World peace can best be achieved by:

Results (190 votes). Check out past polls.

Notices?