Reputation: 42080
In Perl, if you have a loop like this:
foreach (@items) {
perform_action($_);
}
you can replace it with a call to map
in void context:
map {
perform_action($_)
} @items;
Are there any advantages or disadvantages to doing to? Does it have a performance impact because Perl thinks it has to save the results? Does it improve/worsen readability?
Upvotes: 12
Views: 1352
Reputation: 150061
Starting from Perl 5.8.1 map in void context is not expensive:
map in void context is no longer expensive. map is now context aware, and will not construct a list if called in void context.
But the postfix form of for
may be more readable:
perform_action($_) for @items;
Upvotes: 18
Reputation: 80433
The problem with using map
or grep
in void context is mainly conceptual. Both are constructs whose job is to return a list. To discard that list makes for muddled code, unclear on the concept of listops. I never use either of those in void context myself.
I feel the same way about the ternary conditional operator. Its job is to return a value, so using it in void context makes no sense and just confuses people.
That said, I wouldn’t put too much stock into Perl::Critic
or even PBP. I guess it’s better that the book exists than that it doesn’t, but people too often misunderstand the whole point and end up using it as a bludgeon.
Upvotes: 15
Reputation: 754760
I believe 'Perl Best Practices' would recommend using an explicit variable in the foreach
loop as the best style - it is certainly what I'd use.
foreach my $item (@items)
{
perform_action($item);
}
It is an abuse of map
(or grep
) to use it in a void context.
Upvotes: 3