Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Re: Perl's feature to determine, in current point of loop, that this is the last one? (updated: while unpredictable)

by LanX (Sage)
on Jan 23, 2022 at 11:27 UTC ( #11140743=note: print w/replies, xml ) Need Help??


in reply to Perl's feature to determine, in current point of loop, that this is the last one?

That depends on the loop (for,while,map,...) and the iterated thing.

Could you be more specific, or at least point to another language which can do this?

update

Here a counter example to explain one difficulty:

Consider a while loop iterating over human input, how should the loop know in advance that the user will stop the input in the next iteration?

while ( my ($in) = human_input() ) { do_something($in); }

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

  • Comment on Re: Perl's feature to determine, in current point of loop, that this is the last one? (updated: while unpredictable)
  • Download Code

Replies are listed 'Best First'.
Re^2: Perl's feature to determine, in current point of loop, that this is the last one? (updated: while unpredictable)
by ikegami (Patriarch) on Jan 23, 2022 at 17:32 UTC

    It can't be solved generically for while loops.

    while (@a) { shift(@a); if ( is_last_pass() ) { push @a, "foo"; } }

    But, you can "peek ahead" sometimes.

Re^2: Perl's feature to determine, in current point of loop, that this is the last one? (arrays unpredictable)
by LanX (Sage) on Jan 23, 2022 at 16:13 UTC
    So lets suppose it's "only" needed for the case foreach(@array) which isn't an iterator but dealing with a flattened list, right?

    I don't think so, @array could be tied to an iterator via Tie::Array and IIRC there are already modules on CPAN exploiting this "backdoor".

    FWIW it also offers some syntactic sugar to implement your desired feature for a static @array, by designing a sub which returns a tied array-ref wrapping the static one:

    for my $var ( @{ guard_last(@array,my $last) } ) { say "IS LAST" if $last; say $var; }
    edit

    And I'm pretty sure this won't work with Perls older than ~5.10

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (2)
As of 2022-08-09 19:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?