in reply to Re^2: "advanced" Perl functions and maintainability
in thread "advanced" Perl functions and maintainability

I disagree. For complex expressions, foreach can always be made more readable than map, because foreach lets you explicitly name the variable that stores each element from the list you're iterating over. Again, this is why I prefer it for anything more than single-statement greps or maps. It may take a little more typing, but in the end, it's clearer and more readable, and yeah, I guess a little easier on the novices too...

  • Comment on Re^3: "advanced" Perl functions and maintainability

Replies are listed 'Best First'.
Re^4: "advanced" Perl functions and maintainability
by Anonymous Monk on Dec 13, 2004 at 10:46 UTC
    For complex expressions, foreach can always be made more readable than map, because foreach lets you explicitly name the variable that stores each element from the list you're iterating over.
    foreach my $foo (@array) {... $foo ...} map {my $foo = $_; ... $foo ...} @array

      Then why even bother with map to begin with? And no, that isn't as clear. Go back and look at Brian's example. All map blocks need to be evaluated for each element in the list, so when you have a multi-statement block, you end up putting the result at the end, all by itself:

      map { ... $hash; } ...;

      to make sure the block is evaluated properly. This is a side-effect, and it isn't as clear or as readable as an explicit push would be.

        Then why even bother with map to begin with?
        Why not? Some people bother with foreach, one could question that as well.
        And no, that isn't as clear.
        Once again, what's clear and what isn't is highly subjective, heavily influenced by ones experience.
        All map blocks need to be evaluated for each element in the list,
        Uhm, yes. That's the point of a map, isn't? And perhaps you haven't realized it, all foreach blocks are evaluated for each element of the list as well.
        you end up putting the result at the end, all by itself:
        Yeah, neat, isn't? That's the point of map, you know.
        This is a side-effect, and it isn't as clear or as readable as an explicit push would be.
        Actually, it's not a side-effect. Modifying a variable (what push does) is a side-effect.

        But I understand what you are saying. It's utterly unclear to write a map this way. After all, it's also unclear to return a result from a subroutine; it's much clearer if the subroutine explicitly assigns the return value to a variable. All well written programs do.