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

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?


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; }
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

Replies are listed 'Best First'.
Re^2: How to call a function on each item after a split?
by Lotus1 (Curate) 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?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://997882]
[Corion]: ... an aggregator site that also listed (ideally) all of these links once. And maybe also have an exclude list to blacklist some of the most spammy links that the site may have never mentioned at all
[marto]: I gave up reading HN at all, and feel much better for it :P
[Corion]: Now, how to best automate that Google search ... :-)
[Corion]: marto: Yeah, I'm also short of not reading it at all. I already stopped reading it in the morning because it gave me a foul mood.
[Corion]: The good posts on HN are the non-computing posts. Most of the other stuff is maybe relevant to you if you are 20 and live in Silicon Valley...
[Corion]: Two attributes that don't describe me.
[Corion]: Maybe I should also write a curator for HN or simply not read it anymore, like you do.

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (7)
As of 2017-07-24 13:26 GMT
Find Nodes?
    Voting Booth?
    I came, I saw, I ...

    Results (354 votes). Check out past polls.