in reply to Re: syntax of map operator
in thread syntax of map operator

It's easier to see the diff here:
$ diff -u \ <( perl -MO=Concise,-exec -e'@vals = map $_*5, @vals;' 2>&1 ) \ <( perl -MO=Concise,-exec -e'@vals = map { $_*5 } @vals;' 2>&1 ) --- /proc/self/fd/63 2010-01-24 01:45:47.147224485 -0800 +++ /proc/self/fd/62 2010-01-24 01:45:47.123224005 -0800 @@ -1,18 +1,19 @@ -e syntax OK 1 <0> enter -2 <;> nextstate(main 1 -e:1) v +2 <;> nextstate(main 2 -e:1) v 3 <0> pushmark s 4 <0> pushmark s 5 <#> gv[*vals] s 6 <1> rv2av[t6] lKM/1 -7 <@> mapstart lK/2 -8 <|> mapwhile(other->9)[t7] lK/1 +7 <@> mapstart lK*/2 +8 <|> mapwhile(other->9)[t8] lK/1 9 <#> gvsv[*_] s a <$> const[IV 5] s b <2> multiply[t4] sK/2 +- <@> scope lK goto 8 c <0> pushmark s d <#> gv[*vals] s e <1> rv2av[t2] lKRM*/1 -f <2> aassign[t8] vKS/COMMON +f <2> aassign[t9] vKS/COMMON g <@> leave[1 ref] vKP/REFC

It's very unclear what that means. The leading "-" means it's not executed, yet it's still showing in the -exec listing. What does that OP do anyway? It's executed at the *end* of the callback code. Looking at the source doesn't help

PP(pp_scope) { dVAR; return NORMAL; }

Without a lot more digging, B::Concise's output does really help. On the other hand, it's very easy to show that a scope does get created for map BLOCK but not for map EXPR,

...or not.

$ perl -wle'use strict; map +(my $x = $_), 2; print $x' Use of uninitialized value in print at -e line 1.

It seems a run-time scope is created for map EXPR,.

(Compile-time scope affects the visibility of lexical variables. Run-time scopes control when they get cleared. They should be the same, but sometimes they're not.)

Replies are listed 'Best First'.
Re^3: syntax of map operator
by jwkrahn (Abbot) on Jan 24, 2010 at 10:23 UTC
    $ perl -wle'use strict; map +(my $x = $_), 2; print $x' Use of uninitialized value in print at -e line 1.
    It seems a run-time scope is created for map EXPR,.

    Incorrect.    What is happening is the same thing that happens when you do that with a foreach statement modifier:

    $ perl -wle'use strict; my $x = $_ for 2; print $x' Use of uninitialized value $x in print at -e line 1.

    Braces or file boundaries are the only things that can create scope.

      Incorrect. What is happening is the same thing that happens when you do that with a foreach statement modifier:

      That should read "Correct, just like with a foreach statement modifier".

        Yes, but, it's not scope, it's undefined behaviour.    From perlsyn:

        NOTE: The behaviour of a "my" statement modified with a statement modifier conditional or loop construct (e.g. "my $x if ...") is undefined. The value of the "my" variable may be "undef", any previously assigned value, or possibly anything else. Don’t rely on it. Future versions of perl might do something different from the version of perl you try it out on. Here be dragons.

        Emphasis added.