http://www.perlmonks.org?node_id=21106


in reply to Map: The Basics

splinky has got me doing it now... To pick a nit:

Map works on all types of lists, not just those returned by the <> operators. In addition, $_ is a symbolic reference (see perlref), which gives map yet another use, and makes one of your examples a bit confusing. Consider:

my @array = <FILE>; my @newarray = map { s/\#.*$//; $_ } @array;
Now @newarray and @array contain the same thing, as the s/// operator alters the contents of @array! Far better to write:
my @array = <FILE>; map s/\#.*$//, @array;
This way of doing things is deliberate, as it eliminates unnecessary assignments when you want the results to go back to the same array. The <FILE> thing is special, as perl copies the file to a temporary, anonymous, array for use while processing, so you never see that it gets altered.

Andrew.

Replies are listed 'Best First'.
Re: RE: Map: The Basics
by swiftone (Curate) on Jan 12, 2001 at 02:22 UTC
    my @array = <FILE>; map s/\#.*$//, @array;
    This way of doing things is deliberate, as it eliminates unnecessary assignments when you want the results to go back to the same array.

    Except that he explicitly said that if you aren't using the list returned, you shouldn't use map, you should look into another looping structure, such as:

    my @array = <FILE>; s/\#.*$// foreach @array;
    To do otherwise obfuscates the purpose of your loop.