The grep, map, reduce, and sort functions are so powerful and easy to use that (together with other similar user-defined higher-order functions) they can handle many practical tasks in those areas where traditional imperative programming would organize it via loops.
Often, you will need to call one of the functions on the result that another function returned. Consider an example with the list of houses on a street. Some of these houses have to be painted, but you need to choose only those on the even side of the street, which has red facades, which were renovated more than five years ago. The task is to know how much paint you need.
Let us assume that the information about the properties of the house is contained in a data structure like this:
my @street = (
{
number => 1,
renovation_year => 2000,
storeys ...