develooper Front page | perl.perl5.porters | Postings from May 2008

Re: [perl #54974] Strange map {} Behavior When Returning Two Values

Thread Previous | Thread Next
Graham Barr
May 30, 2008 17:36
Re: [perl #54974] Strange map {} Behavior When Returning Two Values
Message ID:
Hash: SHA1

On May 30, 2008, at 9:27 AM, Abigail wrote:

> On Thu, May 29, 2008 at 03:16:31PM +0200, Aristotle Pagaltzis wrote:
>> * H.Merijn Brand <> [2008-05-29 13:00]:
>>> using a semi-colon
>>> $ perl -wle'my@a=map{;"--$_"=>$_}@ARGV;print"(@a)"' foo bar
>>> (--foo foo --bar bar)
>>> using parens
>>> $ perl -wle'my@a=map{("--$_"=>$_)}@ARGV;print"(@a)"' foo bar
>>> (--foo foo --bar bar)
>>> using a unary +
>>> $ perl -wle'my@a=map{+"--$_"=>$_}@ARGV;print"(@a)"' foo bar
>>> (--foo foo --bar bar)
>>> using catenation
>>> $ perl -wle'my@a=map{"--".$_=>$_}@ARGV;print"(@a)"' foo bar
>>> (--foo foo --bar bar)
>>> I personally think that using parens here to disambuigate is
>>> the most verbose option without adding unexplainable line noise
>> Which in my mind makes it the least desirable, since that makes
>> it ???obviously??? superfluous and therefore the most likely to be
>> removed by some overeager maintainer. The semicolon, OTOH, is so
>> unusual that it is much more obviously intentional, even if the
>> maintainer who discovers it doesn???t know what it???s there for. It
>> probably won???t prevent them from removing it, but I would expect
>> that after the code breaks they will conclude that the semicolon
>> was put there purposely to prevent that error. With parens, in
>> contrast, it seems more likely to me that the maintainer will
>> think the code worked just by accident because the previous
>> programmer wrote it in a peculiar style with no particular
>> intent.
> I guess it's matter of style, but I prefer the parenthesis as  
> well.  The
> semi-colon is unual enough that it mystefies many people. The  
> overeager
> maintainer who removes the parenthesis will be left code that doesn't
> compile, let alone pass a test suite. I'm not so worried about that;
> it'll be a simple delete 2 chars, compile, undo cycle.  Worse would be
> a maintainer that wastes half a day what the hell the semi-colon is  
> for.

It is also one of the documented examples where the docs discuss the  
issue that started this thread

   %hash = map {  "\L$_", 1  } @array  # perl guesses EXPR.  wrong
   %hash = map { +"\L$_", 1  } @array  # perl guesses BLOCK. right
   %hash = map { ("\L$_", 1) } @array  # this also works
   %hash = map {  lc($_), 1  } @array  # as does this.
   %hash = map +( lc($_), 1 ), @array  # this is EXPR and works!


Version: GnuPG v1.4.1 (Darwin)


Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About