For Programmers: Free Programming Magazines  


Home > Archive > PERL Beginners > August 2007 > foreach and map..how are they different?









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author foreach and map..how are they different?
Dan Sopher

2007-08-24, 7:01 pm

Aside from the syntax, is there a difference in the way 'map' and
'foreach' process?

Randal L. Schwartz

2007-08-24, 7:01 pm

>>>>> ""Dan" == "Dan Sopher" <dsopher@twistbox.com> writes:

"Dan> Aside from the syntax, is there a difference in the way 'map' and
"Dan> 'foreach' process?

Yes. map is an expression. foreach is a statement. foreach can't
be nested inside a larger expression. map is *meant* to do that,
and using it in a void context is generally frowned upon.

--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
Paul Lalli

2007-08-24, 7:01 pm

On Aug 24, 2:21 pm, dsop...@twistbox.com (Dan Sopher) wrote:
> Aside from the syntax, is there a difference in the way 'map' and
> 'foreach' process?


foreach is just a loop. map returns values. Specifically, it returns
the value of the BLOCK/EXPR for each iteration of the loop.

my @doubles = map { $_ * 2 } @nums;

is exactly equivalent to:

my @doubles;
foreach (@nums) {
push @doubles, $_ * 2;
}

Paul Lalli

Chas Owens

2007-08-24, 7:01 pm

On 8/24/07, Dan Sopher <dsopher@twistbox.com> wrote:
> Aside from the syntax, is there a difference in the way 'map' and
> 'foreach' process?

snip

There are many differences, in addition to what has already been said
map can be more or less cpu efficient than depending on the task*. If
you can use map to avoid a temporary array, then it can save you some
time, but if you need the intermediate result, then for is faster.
Personally, I prefer map (and its cousin grep) for things that can be
done in one line:

my @files = map { $_->{filename} } $sftp->ls();

rather than

my @files;
push @files, $_->{filename} for $sftp->ls();

But if the code being passed to map becomes to complex, I prefer a for loop:

my @headers;
for my $filename (@filenames) {
open my $file, "<", $filename
or die "could not open $filename:$!";
push @headers, scalar <$file>;
}

rather than

my @headers = map { open my $f, "<", $_ or die "could not open $_:$!";
scalar <$_>; } @filenames;


* Here are the benchmarks for a two different scenarios

Map vs for vs map with temp variable

Rate map_with_var for map
map_with_var 3.51/s -- -11% -57%
for 3.92/s 12% -- -52%
map 8.11/s 131% 107% --

#!/usr/bin/perl

use strict;
use warnings;
use Benchmark;

my @a = 1 .. 1_000_000;
my %subs = (
for => sub {
my @b;
push @b, ($_ + 4) for @a;
return @b;
},
map => sub {
return map { $_ + 4 } @a;
},
map_with_var => sub {
my @b = map { $_ + 4 } @a;
return @b;
}
);

Benchmark::cmpthese(-1, \%subs);

Map of Map vs Two for loops vs Map of Map with temp variable vs map of
map with two temp variables:

Rate map_with_2var for map_with_var map
map_with_2var 1793/s -- -8% -16% -45%
for 1950/s 9% -- -8% -40%
map_with_var 2124/s 18% 9% -- -35%
map 3258/s 82% 67% 53% --

#!/usr/bin/perl

use strict;
use warnings;
use Benchmark;

my @a = 1 .. 1_000;
my %subs = (
for => sub {
my @b;
push @b, ($_ + 4) for @a;
my @c;
push @c, ($_ + 4) for @b;
return @b;
},
map => sub {
return map { $_ + 4 } map { $_ + 4 } @a;
},
map_with_var => sub {
my @b = map { $_ + 4 } map { $_ + 4 } @a;
return @b;
},
map_with_2var => sub {
my @b = map { $_ + 4 } @a;
my @c = map { $_ + 4 } @b;
return @c;
}
);

Benchmark::cmpthese(-1, \%subs);
Rob Dixon

2007-08-24, 7:01 pm

Dan Sopher wrote:
>
> Aside from the syntax, is there a difference in the way 'map' and
> 'foreach' process?


Hi Dan

Internally they're very similar, but you shouldn't be thinking like that.

As Randal said, foreach is a statement - a language construct like 'if',
'while', 'else' and so on - while map is an expression - more specifically
a function.

Use foreach if you want to execute a block of Perl code for every element
in a list.

Use map to implement a /mapping/ between two lists. It takes an input list
and a statement or a block specifying a transformation, and (in list
context) returns the list with that transformation applied to each element.
Conceptually there is no loop - the entire list is transformed at once, and
a scalar expression like

$a = 2 * $b

corresponds exactly to the list expression

@a = map 2 * $_, @b

HTH,

Rob

Jeff Pang

2007-08-24, 9:59 pm

Both map and foreach can do the same thing,though they're used in
different syntax environment.
I follow a rule,if you need to return a result list,use map.Otherwise
use for/foreach.
Also sometime we can use map to do some flexible translation,like
Schwartz Translation.


2007/8/25, Dan Sopher <dsopher@twistbox.com>:
> Aside from the syntax, is there a difference in the way 'map' and
> 'foreach' process?
>
>
> --
> To unsubscribe, e-mail: beginners-unsubscribe@perl.org
> For additional commands, e-mail: beginners-help@perl.org
> http://learn.perl.org/
>
>
>

Randal L. Schwartz

2007-08-25, 4:00 am

>>>>> ""Jeff" == "Jeff Pang" <rwwebs@gmail.com> writes:

"Jeff> Also sometime we can use map to do some flexible translation,like
"Jeff> Schwartz Translation.

That's a new one for me. Are you trying to say "Schwartzian Transform"?

--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn@stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
Jeff Pang

2007-08-25, 4:00 am

2007/8/25, Randal L. Schwartz <merlyn@stonehenge.com>:
>
> "Jeff> Also sometime we can use map to do some flexible translation,like
> "Jeff> Schwartz Translation.
>
> That's a new one for me. Are you trying to say "Schwartzian Transform"?
>


Yes,sorry for spelling wrong.You're right.:)
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com