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


in reply to array with s///g command

Or, if you want to be brief...
# assuming @array1 contains the values to change. my @array2 = @array1; @array2 = map { s/\s//g; $_ } @array2; print @array2;

Gary Blackburn
Trained Killer

Replies are listed 'Best First'.
Re^2: array with s///g command
by wind (Priest) on Jul 30, 2007 at 00:14 UTC
    Slightly cleaner:
    my @array2 = @array1; s/\s+//g for (@array2);
    Or in a single statement:
    my @array2 = map {(my $x = $_) =~ s/\s+//g; $x} @array1;
    The main concern you must have when dealing with map and a regex is not destructing the original array unless you truly intend to. $_ is an alias to each element of the source array, so any modification of it modifies the original array. To avoid this we assign to a temporary lexical in the above map block. And then finally make sure to return the actual variable and not a count of the number of substitutions.

    Personally, I'd probably just stick with your original code, as I kind of doubt that you truly need a second array with these crunched values. Instead simply add the "crunching" as part of the loop for whatever other processing that you intend to be doing. Whatever that may be.

    - Miller
      You can simply join the statements
      my @array2 = @array1; s/\s+//g for (@array2);
      into one:
      tr/ //d for my @array2 = @array1;
      The tr/// here only treats blanks instead of general white space, but that's easily changed if necessary.

      Anno

      thanks guys, it's working. I still dont' understand map too well(along with many other things).. can someone show me a URL that has map tutorial better than http://perldoc.perl.org/functions/map.html ?? Their explanation on how to mix it in with other does not make much sense to me.

        You should take a bit of time to browse through the Tutorials section here. Of immediate interest you will find Map: The Basics there and the List Processing, Filtering, and Sorting sub-section in general is likely to be of value. But don't stop there - you will find lots of good stuff if you poke around the many corners and alcoves of the Tutorials section.


        DWIM is Perl's answer to Gödel
Re^2: array with s///g command
by liverpole (Monsignor) on Jul 30, 2007 at 00:04 UTC
    I like brief too ... why not simply:?
    my @array2 = map { s/\s+//g; $_ } @array1;

    Update  Whoops, now I see ... it's because you'd be changing the original array.  Still, I like the brevity of something like:

    my @array2 = map { (my $x = $_) =~ s/\s+//g; $x } @array1;

    s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/

      Because that mangles @array1 - $_ is aliased to each element from @array1 and the substitution clobbers the original value


      DWIM is Perl's answer to Gödel
Re^2: array with s///g command
by grinder (Bishop) on Jul 30, 2007 at 10:00 UTC
    tr/ //d for @array2;

    will probably be a tad faster, in that it transliterates, and avoid using a code block.

    • another intruder with the mooring in the heart of the Perl