Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"

Re: array with s///g command

by Trimbach (Curate)
on Jul 29, 2007 at 23:53 UTC ( #629455=note: print w/replies, xml ) Need Help??

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 ?? 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.


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;


      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

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://629455]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (4)
As of 2021-09-22 21:50 GMT
Find Nodes?
    Voting Booth?

    No recent polls found