in reply to Re: HTML::LinkExtor weirdness (scoping closures nested named subs)
in thread HTML::LinkExtor weirdness

Indeed, that change doe make things work! Is there somewhere I an further read to understand where I went wrong?

Infinitely grateful for your help - that darn thing was giving me public fits ;)

-skazat
  • Comment on Re^2: HTML::LinkExtor weirdness (scoping closures nested named subs)

Replies are listed 'Best First'.
Re^3: HTML::LinkExtor weirdness (scoping closures nested named subs)
by ig (Vicar) on Nov 06, 2013 at 23:41 UTC

    The error message Variable "%s" will not stay shared is described in perldiag. The description is brief but explains the behavior you experienced. You can also read about closure in perlref, perlsub and elsewhere.

Re^3: HTML::LinkExtor weirdness (scoping closures nested named subs)
by Anonymous Monk on Nov 07, 2013 at 00:27 UTC

    This is why you don't nest named subs, the closure becomes "static"

    perl -E " sub f{ my %g; sub g{say \%g; } g(); say \%g; \%g } say f(),$/ for 1 .. 4;"

    perl -E ' sub f{ my %g; sub g{say \%g; } g(); say \%g; \%g } say f(),$/ for 1 .. 4; '

    HASH(0xabd9c4) HASH(0xabd9c4) HASH(0xabd9c4) HASH(0xabd9c4) HASH(0x3f9b6c) HASH(0x3f9b6c) HASH(0xabd9c4) HASH(0x3f9b8c) HASH(0x3f9b8c) HASH(0xabd9c4) HASH(0x3f9b6c) HASH(0x3f9b6c)

    By making the nested subroutine a variable (also known as an anonymous sub), the closure is dynamic

    $ perl -lE " sub f{ my %g; my $g = sub {say \%g; $g{1}++}; $g->(); say \%g; \%g } say f(),$/ for 1 .. 4;"

    HASH(0xabd9d4) HASH(0xabd9d4) HASH(0xabd9d4) HASH(0x3f9b1c) HASH(0x3f9b1c) HASH(0x3f9b1c) HASH(0x99b374) HASH(0x99b374) HASH(0x99b374) HASH(0x99b344) HASH(0x99b344) HASH(0x99b344)
Re^3: HTML::LinkExtor weirdness (scoping closures nested named subs)
by Anonymous Monk on Nov 06, 2013 at 23:34 UTC
    I linked it already, just follow the linked links :)