chen li wrote: > > --- Tom Phoenix <[EMAIL PROTECTED]> wrote: > >>The expression in a map is evaluated in a list >>context. The list that >>it returns is included in the result list. > >>The expression in a grep is a Boolean value, so it's >>evaluated in a >>scalar context. If it's true, the corresponding >>value from the list >>(that is, the value of $_ inside the expression) is >>included in the >>result list. >> >>These properties make grep useful for simply >>selecting elements from a >>list, while map is able to transform a list in a >>more general way. > > So map function returns the transformed or changed > elements but not the original ones and grep still > returns the original ones? For example after certain > operation A changes to B, in case of map the return > is B but in case grep the return is still A. Is that > right?
Perl provides four basic list transformation functions: NEW_LIST = grep EXPRESSION, OLD_LIST; NEW_LIST = map EXPRESSION, OLD_LIST; NEW_LIST = reverse OLD_LIST; NEW_LIST = sort SUB OLD_LIST; They all take an old list and potentialy modify it and return a different list. The ONLY thing that they have in common is that (just like the for/foreach loops/statement modifiers) they alias $_ so if $_ is modified the ORIGINAL DATA IS MODIFIED. $ perl -le' my @a = qw/ 6 3 8 4 1 0 4 3 /; print "[EMAIL PROTECTED] = @a"; my @b = sort @a; print "[EMAIL PROTECTED] = @a [EMAIL PROTECTED] = @b"; my @c = map { $_ *= 2 } sort @a; print "[EMAIL PROTECTED] = @a [EMAIL PROTECTED] = @c"; my @d = grep { $_ -= 1 } reverse @a; print "[EMAIL PROTECTED] = @a [EMAIL PROTECTED] = @d"; ' @a = 6 3 8 4 1 0 4 3 @a = 6 3 8 4 1 0 4 3 @b = 0 1 3 3 4 4 6 8 @a = 12 6 16 8 2 0 8 6 @c = 0 2 6 6 8 8 12 16 @a = 11 5 15 7 1 -1 7 5 @d = 5 7 -1 1 7 15 5 11 Because of the way that grep evaluates its expression it cannot return anything that is not in the original list. map however can return anything: my @x = map { ( 'X' ) x 3 } 1 .. 3; @x now contains ( 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ). map can imitate grep: NEW_LIST = grep EXPRESSION, OLD_LIST; NEW_LIST = map EXPRESSION ? $_ : (), OLD_LIST; But grep CANNOT imitate map. John -- use Perl; program fulfillment -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>