http://www.perlmonks.org?node_id=798117


in reply to Re^3: Inline substitution regex
in thread Inline substitution regex

Just guessing, shouldn't the solution be:

foreach (keys %{$ref_cookie}) { push @{$self->{cookies}}, /^-(.*)/, $ref_cookie->{$1}); }

?

Or the curly brackets from the failing original code isolate $_ and the substitution does not affect the last parameter of push?

# push(@{$self->{cookies}}, {$_=~s/^-//}, $ref_cookie->{$_}});

Replies are listed 'Best First'.
Re^5: Inline substitution regex
by ikegami (Patriarch) on Sep 29, 2009 at 16:31 UTC

    Your solution is definitely buggy.

    Let's say %$ref_cookie contains

    -foo => 'food', -bar => 'bard'

    The solution you propose would push

    'foo', undef, 'bar', undef -or- 'bar', undef, 'foo', undef (depending on the order the keys are returned)

    That's obviously not what he wants. He would just use undef if so.

    Fine, you'll say %$ref_cookie should contain

    -foo => 'food', foo => 'fool', -bar => 'bard', bar => 'barl'

    The solution you propose would push

    'foo', 'fool', 'fool', 'bar', 'barl', 'barl' -or- 'foo', 'fool', 'fool', 'fool', 'bar', 'barl' -or- undef, undef, 'bar', 'barl', 'foo', 'fool' -or- ... (depending on the order the keys are returned)

    It makes no sense. I suspect the OP wants

    'foo', 'food', 'bar', 'bard' -or- 'bar', 'bard', 'foo', 'food' (depending on the order the keys are returned)

    That is achieved using the solution I proposed.

      Wow, that was an unexpected answer... :-)

      With post "I should've known better!" in mind, I was trying to understand if $_ is modified only in the scope of the substitution from the OP's attempt:

      foreach (keys %{$ref_cookie}) { push(@{$self->{cookies}}, {$_=~s/^-//}, $ref_cookie->{$_}}); }

      I didn't pay much attention on the context or what keys should be. I see your point and agree.

      Now, if OP has both types of keys, with and without leading hashes:

      -foo => 'food', bar => 'barl'

      the code should be:

      push @{$self->{cookies}}, /^-?(.*)/, $ref_cookie->{$_};

      to get all four values in the array.

      BTW, I'll have to practice more with push of undef in arrays...

        I had only answered your first question. As for your second question, no, the hash creation operator ({}) does not localize $_. Curlies don't localize $_ when they're used as a bare block either. And neither does do. $_ is only implicitly localized by foreach loops (when no iterator variable is provided), map and grep.