Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: How to call a function on each item after a split?

by 2teez (Priest)
on Oct 08, 2012 at 21:40 UTC ( #997882=note: print w/ replies, xml ) Need Help??


in reply to How to call a function on each item after a split?

Hi,

Please, before one shutdown the wonderful solution first given by aitap above on this issue,
Or wonder why "the" lovely map function doesn't do the "magic" as expected, Please, check the OP subroutine clean().

sub clean { chomp($_[0]); $_[0] =~ s/^\s+//g; $_[0] =~ s/\s+$//g; }
Why use chomp and then sepeartely, remove spaces? At the beginning and endling of each value?
I thought, \s+ also covers \n that chomp is suppose to remove?
I modified the OP clean subroutine and both map and grep gave the happy endling.
So, there is really no need for the extra $_ as perviously stated, if the modified subroutine is considered.
check below:
#!/usr/bin/perl use strict; use warnings; my $str = "item1 | item2| item3 |item4| "; my @cleaned1 = map { clean_modify($_) } split( /\|/, $str ); my @cleaned2 = grep { clean_modify($_) } split( /\|/, $str ); print join "\n", @cleaned1; print join "\n", @cleaned2; sub clean_modify { $_[0] =~ s/^\s+?|\s+?$//g; return $_[0]; } sub clean { ## don't use chomp( $_[0] ); $_[0] =~ s/^\s+//g; $_[0] =~ s/\s+$//g; }
OUTPUT
item1 item2 item3 item4 item1 item2 item3 item4

If you tell me, I'll forget.
If you show me, I'll remember.
if you involve me, I'll understand.
--- Author unknown to me


Comment on Re: How to call a function on each item after a split?
Select or Download Code
Re^2: How to call a function on each item after a split?
by Lotus1 (Chaplain) on Oct 10, 2012 at 02:40 UTC

    Your demonstration of using grep like that only works if the function modifies $_. Your example makes it seem that map and grep are equivalent which they aren't. grep looks at the return value in the block to determine whether or not to pass along $_ while map passes along the return value in the block. Big difference. If one of the values in the string happens to be '0' then grep doesn't pass that value through. Also your solution doesn't pass along the final empty string like the one with the map{ clean($_);$_ } solution did.

    #!/usr/bin/perl use strict; use warnings; my $str = "item1 | 0 | | item2| item3 |item4 | "; my @cleaned1 = map { clean_no_side_effects($_) } split( /\|/, $str ); my @cleaned2 = grep { clean_no_side_effects($_) } split( /\|/, $str ); print "*"x25, "\n"; print join "\n", @cleaned1; print "*"x25, "\n"; print join "\n", @cleaned2; print "*"x25, "\n"; sub clean_no_side_effects { my $string = shift; $string =~ s/^\s+|\s+$//g; return $string; } sub clean_modify { ## don't use, still using side effects for grep t +o work $_[0] =~ s/^\s+?|\s+?$//g; # '?' isn't needed here since \s neve +r matches '|' return $_[0]; } sub clean { ## don't use chomp( $_[0] ); $_[0] =~ s/^\s+//g; $_[0] =~ s/\s+$//g; } __END__ ************************* item1 0 item2 item3 item4 ************************* item1 item2 item3 item4 *************************

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (14)
As of 2014-12-18 07:00 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (44 votes), past polls