in reply to Re^3: Multiple uses of (?{ code }) do not appear to be called
in thread Multiple uses of (?{ code }) do not appear to be called

Heh, nifty. But why not simply say our @o = ();? Surely the scope is still limited to the sub. I'm a bit puzzled by how local interacts with our here.

Replies are listed 'Best First'.
Re^5: Multiple uses of (?{ code }) do not appear to be called
by ikegami (Patriarch) on Dec 29, 2006 at 19:14 UTC

    local our @o;
    is the same as
    our @o;
    local @o;

    our @o; disables use strict for @o.
    local @o; protects the existing value of @o (and initialized @o to an empty array).

    Without the local, there's no scoping. That's bad! If the caller also uses @o, you just clobbered the caller's variable.

      Right, gotcha. I was confused, since the perldocs say: "An "our" declares the listed variables to be valid globals within the enclosing block". It didn't occur to me at first that an inner scope would simply reuse an "our" in the enclosing scope. I now also see what diotalevi meant with stomping on my parent :)

        dio wasn't refering to enclosing scopes. Compare

        sub test { my ($x) = shift; return if !$x; our @o = $x; test($x-1); print("@o\n"); } test(3); # 1,1,1

        with

        sub test { my ($x) = shift; return if !$x; local our @o = $x; test($x-1); print("@o\n"); } test(3); # 1,2,3

        The same problem occurs without recursion too. Compare

        sub foo { my ($x) = shift; our @o = 1; bar(); print("@o\n"); } sub bar { my ($x) = shift; our @o = 2; print("@o\n"); } foo(); # 2,2

        with

        sub foo { my ($x) = shift; local our @o = 1; bar(); print("@o\n"); } sub bar { my ($x) = shift; local our @o = 2; print("@o\n"); } foo(); # 2,1
Re^5: Multiple uses of (?{ code }) do not appear to be called
by diotalevi (Canon) on Dec 29, 2006 at 15:58 UTC

    If your function is reentrant then you've just protected your parent against your stomping on it.

    ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

Re^5: Multiple uses of (?{ code }) do not appear to be called
by bsdz (Friar) on Dec 29, 2006 at 21:54 UTC
    If you don't specify the local modifier then @o is visible outside the scope. I.e.
    use strict; { local our $a = "A"; } { our $b = "B"; } print "a = $a\n"; print "b = $b\n"; __DATA__ a = b = B
      See, this is why ourperl is so confusing :-)

      You are bitten by the magic of $a and $b:

      #!/usr/bin/perl -l use strict; { local our $x = "A" } { our $y = "B" } print "x=$x"; print "y=$y"; __END__ Variable "$x" is not imported at our2.pl line 7. Variable "$y" is not imported at our2.pl line 8. Global symbol "$x" requires explicit package name at our2.pl line 7. Global symbol "$y" requires explicit package name at our2.pl line 8. Execution of our2.pl aborted due to compilation errors.
        Yes, my mistake, you are completely right. Localizing $a is a common thing to do but not the way I put it.