http://qs321.pair.com?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
      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
      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

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