in reply to Re: my (0?$a:$b): a koan
in thread my (0?$a:$b): a koan

I wouldn't worry about my(0?$x:$y) too much.
Oh, I'm not "worried" -- there's no need to either deprecate or document it. I just think: (1) it is surprising that it parses at all, since I thought "my" took a list of variables; and (2) it shows the compile- and run-time effects of "my" in an interesting way.

Replies are listed 'Best First'.
Re^3: my (0?$a:$b): a koan
by ikegami (Patriarch) on May 05, 2011 at 16:26 UTC

    it is surprising that it parses at all, since I thought "my" took a list of variables

    I suspect that it takes any expression, then checks if the expression is valid.

    >perl -e"my ( f($x, $y.) );" syntax error at -e line 1, near ".) " Execution of -e aborted due to compilation errors.

    The catch here is that that constant folding happens before the check.

    Another allowed expression:

    >perl -e"my(my(my(my $sharona)))" >
      I suspect that it takes any expression, then checks if the expression is valid.
      Yeah, but even then, it will reject most expressions:
      $perl -we 'my(f($x))' Can't declare subroutine entry in "my" at -e line 1, at EOF Execution of -e aborted due to compilation errors.
      Now, my does return an lvalue, and ?: can, but that isn't enough in itself for it to be accepted by my:
      $ perl -we 'my($x = 3)' Can't declare scalar assignment in "my" at -e line 1, at EOF Execution of -e aborted due to compilation errors.
      What the reason is that my(my $x) and my(0?$x:$y) are accept isn't clear to me.

      This one is interesting:

      $ perl -we 'my(local $x)' Can't localize lexical variable $x at -e line 1. $ perl -we 'perl -we 'local(my $x)' Can't localize lexical variable $x at -e line 1. $
      Regardless of the nesting of local and my, we get the same error message.

      Mixing state and my:

      $ perl -wE 'sub f {state (my $x); say ++$x} f; f;' 1 1 $ perl -wE 'sub f {my (state $x); say ++$x} f; f;' 1 2 $ perl -wE 'sub f {state my $x; say ++$x} f; f;' No such class my at -e line 1, near "{state my" Execution of -e aborted due to compilation errors.
      Mixing our and local:
      $ perl -wE 'sub f {our local $x; say ++$x} f; f;' No such class local at -e line 1, near "{our local" Execution of -e aborted due to compilation errors. $ perl -wE 'sub f {our (local $x); say ++$x} f; f;' 1 1 $ perl -wE 'sub f {local our $x; say ++$x} f; f;' 1 1 $
      So we can have our (local $x), local our $x, but our local $x doesn't parse.

        What the reason is that my(my $x) and my(0?$x:$y) are accept isn't clear to me.

        my(0?$x:$y) gets constant-folded to valid my($y). The validity checker apparently runs after constant-folding.

        $lex and my $lex are the same op. The only difference is the LVINTRO flag. The validity checker apparently doesn't check the flag.

        Can't localize lexical variable $x

        This is consistent with my guess at the workings, that any variable lookup in the my argument expression is taken to be a lexical declaration. local craps out on the lexical passed to it. (Don't forget, local doesn't declare variables.)