in reply to anonymous sub, packages, global variables

You can attach it to either a sub reference, or as a scalar to a sub reference

*p2::func = $func; package p2; our $x = 100; func();
or
*p2::func = \$func; package p2; our $x = 100; $func->();

However, both of those will still use the '$x' global defined in package 'p1'. To fix that, rely on parameters instead of a global var.

#!/usr/bin/perl use warnings; use strict; package p1; our $x = 1; my $func = sub { print $_[0],"\n" }; $func->($x); *p2::func = $func; package p2; our $x = 100; func($x);

Or use caller to determine where the function was called from (very messy).

#!/usr/bin/perl use warnings; use strict; package p1; our $x = 1; my $func = sub { my $pkg = (caller)[0]; no strict 'refs'; print ${"${pkg}::x"},"\n" }; $func->(); *p2::func = $func; package p2; our $x = 100; func();

Replies are listed 'Best First'.
Re^2: anonymous sub, packages, global variables
by LanX (Saint) on May 17, 2011 at 18:45 UTC
    *p2::func = \$func;

    sorry but thats nonsense, your assigning a coderef to the scalar slot of the glob, not to the code slot!

    update:

    DB<101> $coderef=sub {print "nonsense"} DB<102> *glob=\$coderef DB<103> &$glob nonsense DB<104> glob()

    Cheers Rolf

      Exactly, because he wanted to be able to call his function using $func->() in package p2 just like in p1. I therefore showed how how to achieve both potentially desired results: being able to call his function like func() or by $func->() like he had in his code.

      I wouldn't advocate either methods, but it's what he asked for.

        OK sorry, after rereading the OP's code I see the whole question is bizarre.

        He seems to want a function to work on variables from the current package of the caller's context...

        Cheers Rolf