in reply to Re: How to distinct the call position of a sub?
in thread How to distinct the call position of a sub?

Old_Gray_Bear,
I would agree with the caveat that it would likely fail to DWIM in many situations. Assuming way too much about how LanX will use it, the following seems to work:
#!/usr/bin/perl use strict; use warnings; { my %seen; sub iter { my ($beg, $end, $by) = @_; my $key = join '*', caller(); return $seen{$key}->() if $seen{$key}; my $pos = $beg - $by; $seen{$key} = sub { $pos += $by; if ($pos > $end) { delete $seen{$key}; return; } return $pos; }; return $seen{$key}->(); } } while (my $x = iter(1, 10, 1)) { print "$x\n"; while (my $y = iter(1, 10, 1)) { print "$x - $y\n"; } }
Update: In some versions of perl (5.8.8 and 5.10.0 reported in the CB), an infinite loop results if you delete the print "$x\n"; line. It seems that unless there is some executable statement between the two while loops, caller reports them as happening on the same line. While I think this is a bug in perl, it also shows why this is not a good solution. Running perl -MO=Deparse doesn't seem to support why perl believes they are on the same line.

Cheers - L~R

Replies are listed 'Best First'.
Re^3: How to distinct the call position of a sub?
by almut (Canon) on Nov 24, 2008 at 20:56 UTC

    Seems to be rather fragile... i.e. for me it works with Perl 5.10.0 if you leave in the print "$x\n"; (without it, I can replicate the infinite loop), but with Perl 5.8.8, the iterator returns the wrong values (with and without the print "$x\n"; — no infinite loop here, though):