in reply to Re^4: Designing a DWIMish interface for generator function
in thread Designing a DWIMish interface for generator function

Just like you need to call keys before each, you'd need to reset the iterator before entering the loop. You'd need

init_deal my ($a,$b,$c) while (deal [1..9] => ($a,$b,$c) ){ ... }

Replies are listed 'Best First'.
Re^6: Designing a DWIMish interface for generator function
by LanX (Saint) on Feb 01, 2010 at 11:12 UTC
    Hi

    As I already admitted last is really an unexpected problem... 8(

    (Hmm ... maybe there's a way by trying to catch the destruction of the iterator variable... )

    Talking about positional subs and leaking I already found a nice workaround by using code-blocks!¹ 8)

    sub noleak (&$) { my $cr=shift; $_[0]=$cr } my @a; for (0..9) { noleak {0,5} my $a; push @a,$a; print $a }

    The code-reference seems - as expected - to be precalculated at compile time and is fix!

    /usr/bin/perl -w /home/lanx/B/PL/PM/iter_leak.pl CODE(0xa099b48)CODE(0xa099b48)CODE(0xa099b48)CODE(0xa099b48)CODE(0xa09 +9b48)CODE(0xa099b48)CODE(0xa099b48)CODE(0xa099b48)CODE(0xa099b48)CODE +(0xa099b48)

    Or do you have an idea to break this approach?

    Cheers Rolf

    UPDATE:

    ARGHH it only works when using fixed values...

    sub noleak (&$) { my $cr=shift; $_[0]=$cr } my ($start,$end)=(1,20); my @a; for (0..9) { $start++; noleak {$start,$end} my $a; push @a,$a; print $a }

    output

    CODE(0x8e29760)CODE(0x8e47ca8)CODE(0x8e47d08)CODE(0x8e47d68)CODE(0x8e4 +7dc8)CODE(0x8e47e28)CODE(0x8e47e88)CODE(0x8e47ee8)CODE(0x8e47f48)CODE +(0x8e47fa8)

    ... but commenting out the push produces:

    CODE(0x81f7760)CODE(0x81f7760)CODE(0x81f7760)CODE(0x81f7760)CODE(0x81f +7760)CODE(0x81f7760)CODE(0x81f7760)CODE(0x81f7760)CODE(0x81f7760)CODE +(0x81f7760)

    and there is no need to propagate the coderef outside the sub...

    UPDATE

    ¹) I ran some tests, better forget it...it really only seems to work reliably with constant values in the code-block ...seems to be an optimization issue.

    UPDATE I'm going to run some tests with state.