Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

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

by tobyink (Canon)
on Apr 18, 2014 at 09:17 UTC ( [id://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 (Archbishop) 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?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (2)
As of 2024-04-19 21:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found