I think it's likely this technique would also work for you.
In fact, more than just likely...
sub from (&$) {
use Devel::Callsite qw< callsite context >;
use Scope::Upper qw< reap UP >;
my ($iterator_source) = @_;
# Uniquely identify this call, according to its lexical context...
my $ID = callsite() . context();
# Install the iterator...
state %iterator_for;
$iterator_for{$ID} //= $iterator_source->();
# Install destructor for iterator at end of caller's block...
reap { delete $iterator_for{$ID} } UP UP;
# Iterate...
return $iterator_for{$ID}->($_[1]);
}
for my $limit (reverse 1..5) {
while ( from{countdown($limit)} my $a ) {
print "$a: ";
}
print "\n";
}
sub countdown{
my $val = shift;
my $iter = sub {
if ($val--) {
$_[0]=$val;
return 1;
}
return; # stop iteration
};
return $iter;
}
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|