On 8/24/07, Dan Sopher <[EMAIL PROTECTED]> 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); -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/