Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Re: Different result for 'foreach' vs 'while shift' arrayref

by tobyink (Abbot)
on Apr 18, 2014 at 09:17 UTC ( #1082734=note: print w/ replies, xml ) Need Help??

in reply to Different result for 'foreach' vs 'while shift' arrayref

With this one:

while (my $result = shift(@$rowcache) )

If @$rowcache contains a false value (e.g. undef, or the empty string, or the number 0), then when that value is reached, the condition will become false, so the while loop will exit.

If you really want to use while, then you could do:

while (my ($result) = @$rowcache ? shift(@$rowcache) : ())

Or, if you know that @$rowcache consists of only defined values (no undefs, but perhaps some empty strings and zeros), you could do:

while ( defined(my $result = shift @$rowcache) )
use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name

Comment on Re: Different result for 'foreach' vs 'while shift' arrayref
Select or Download Code
Replies are listed 'Best First'.
Re^2: Different result for 'foreach' vs 'while shift' arrayref
by Your Mother (Chancellor) on Apr 18, 2014 at 23:57 UTC

    And I think this, while breaking the mental encapsulation of the single line versions, might be easier for some hackers to grok. No personal preference here; just tossing one more on the pile.

    while ( @{$rowcache} ) { my $result = shift @{$rowcache}; ....

      That's certainly true. I often use that, and have no idea why I didn't suggest it myself!

      Generally speaking the reason to use this idiom is when you need to loop through a list and in each iteration you need to take one or more items from the list.This kind of thing:

      use strict; use warnings; use Data::Dumper; my @input = ( 'foo:' => 1, 'bar:' => 2, 'baz', # no colon, so value is "1" 'quux:' => 3, ); my %output; while (@input) { my $key = shift @input; if ($key =~ /\A(.+):\z/) { $output{$1} = shift @input; } else { $output{$key} = 1; } } print Dumper \%output;

      If you only need to step through the list one at a time, use foreach; it's clearer.

      use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1082734]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (4)
As of 2015-11-28 03:09 GMT
Find Nodes?
    Voting Booth?

    What would be the most significant thing to happen if a rope (or wire) tied the Earth and the Moon together?

    Results (737 votes), past polls