in reply to Confessions of a back-alley map abuser

I disagree that ugly0 and ugly1 really are ugly. ugly0 is just list assignment syntax. ugly1 is just recognition that we need a return value from the map block. And in my mind, the only abuse of map, is when you use it in void context or throw away the return value(s).

Having said that, your example does not so much look like a pipeline to me. It looks more like a succession of operations:

my $sBegin = "hello world"; my $sEnd = do { local $_ = $sBegin; s/hello/goodbye/g; s/world/todo el mondo/; uc; }; print $sEnd;

When the only tool you have is map, every problem looks like a pipeline?

print "Just another Perl ${\(trickster and hacker)},"
The Sidhekin proves Sidhe did it!

Replies are listed 'Best First'.
Re^2: Confessions of a back-alley map abuser
by itub (Priest) on Dec 18, 2004 at 19:28 UTC
    I like to use "for" for that kind of thing:

    my $sBegin = "hello world"; my $sEnd = $sBegin; for ($sEnd) { s/hello/goodbye/g; s/world/todo el mondo/; uc; }; print $sEnd;

      I like to use "for" for that kind of thing

      Me too, but I have found do{} is more readable. For one thing, it saves you from your bug: Your version throws away the uppercase string and so prints just "goodbye todo el mondo". My version would look like this:

      my $sBegin = "hello world"; my $sEnd; for ($sEnd = $sBegin) { s/hello/goodbye/g; s/world/todo el mondo/; $_ = uc; }; print $sEnd;

      TIMTOWTDI, but I think do{} is the more readable here.

      Update: I trust you. No problem. But the bug still illustrates how the void context makes the for loop slightly less readable here. Such a bug (update: or the more likely opposite bug) could not as easily occur in the do{} block.

      print "Just another Perl ${\(trickster and hacker)},"
      The Sidhekin proves Sidhe did it!

        Oops, thanks! I didn't test the code, of course. It was just a quick cut-n-paste recast as a for. But trust me, when I do it in practice it works fine. ;-)