Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

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

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 all is quiet...

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (5)
As of 2017-04-26 07:04 GMT
Find Nodes?
    Voting Booth?
    I'm a fool:

    Results (469 votes). Check out past polls.