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


in reply to A better (ie.more concise) way to write this?

BrowserUk:

I'd do it like this:

@a = map { ++$_ % 10 } @a;

If I'm missing the point and you're explicitly wanting to only alter a subset of the items, a slice'll adapt it:

@a = map {++$_ % 10 } @a[0-5,7];

Update: If the point is to modify it in place, I like the AM post above...

...roboticus

When your only tool is a hammer, all problems look like your thumb.

Replies are listed 'Best First'.
Re^2: A better (ie.more concise) way to write this?
by Anonymous Monk on Dec 13, 2013 at 17:35 UTC

    Watch out, because

    @b = map { ++$_ % 10 } @a;

    modifies both @a and @b.

    You can also do something like this:

    $_ = ($_+1) % 10 for @a[3..7];
Re^2: A better (ie.more concise) way to write this?
by BrowserUk (Patriarch) on Dec 13, 2013 at 18:23 UTC
    I'd do it like this:@a = map { ++$_ % 10 } @a;

    That pretty much defeats the purpose. Instead of:

    $things{ $thing }{$someotherkey}[$someindex]{$somekey}[ $_ ] = $things +{ $thing }{$someotherkey}[$someindex]{$somekey}[ $_ ] + 1 % 10 for 1 +.. 10;

    You get:

    @{ $things{ $thing }{$someotherkey}[$someindex]{$somekey} }[ 1 .. 10 ] + = map{ ++$_ % 10 } @{ $things{ $thing }{$someotherkey}[$someindex]{$ +somekey} }[ 1 .. 10 ];

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Then , if you want to modify an existing data structure, what about using the fact that modifying $_ will modify the original array? Something like this, shown under the debugger:
      DB<1> @a = 1..9; DB<2> map{ $_ = ++$_% 10 } @a; DB<3> x @a 0 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 0 DB<4>
      Well, this obviously works, but something like $c = ++$c is, I believe, not defined in C and probably also not in Perl (i.e. the implementor if free to do whatever). It could be changed to:
      map { $_ ++; $_ = $_ % 10} @a;
      This would probably be more secure against any change of implementation.