[Edinburgh-pm] a Perl surprise

Jeff Parsons bynari at gmail.com
Wed Jul 18 11:26:33 PDT 2012


On 18/07/2012 18:32, Nick wrote:
> Yes indeed, another potential surprise.  I hadn't thought of it in terms of the
> "comma operator", and in fact I don't normally consider it an operator so much
> as a piece of delimiting syntax.  I'll try and remember to.
>
> I confess I don't find this particular behaviour of commas very useful in
> practise, and it has the side-effect of the surprising behaviour we're
> discussing.  I'm trying and failing to think of a case where it helps.  Can you
> think of one?
>

I personally can't think of a reason when comma operator in scalar 
context's behaviour is useful, but A) I'm sure there is and B) Perl is 
all about flexibility and freedom. It's what gives Perl its power but 
also makes it trickier than other languages like Python. Perl in terms 
of what you can do is the most powerful out of python/ruby/perl. There's 
things Perl can do that python/ruby can't like a program modifying its 
own op tree. It's Perl's flexibility and power that gives us coolness 
like Moose and MooseX::Declare or even perl5i, which I used to use, but 
decided not to now. perl5i is still extremely cool though. :-)

>>>    perl -le 'sub wtf { my @a = 6, 7, 8; @a }; print wtf;' # -> 6
>>>    perl -le 'sub wtf { my $a = (6, 7, 8); $a }; print wtf;' # -> 8
>> I don't think your first example there shows what you think it does —
>> the relative precedence of assignment and comma make it identical to
>>
>> perl -le 'sub wtf { (my @a = 6), 7, 8; @a } print wtf'
> Actually, that is in fact what I understood it to mean.  This example was meant
> to show another case where the grammar rules are (in my opinion) surprising,
> even having learnt them.  When would I ever want to silently discard the terms 7
> and 8 like this? It seems more practical to either
>
>   a) have Perl "DWIM" (and assign the values to the list),
>
> or perhaps preferably,
>
>   b) generate a syntax error (so I can alter it to be less ambiguous).
>
> If I really wanted to have the terms 7 and 8 evaluated and the result discarded
> (perhaps with some side effect) I would probably use semi-colons, not commas.
>
>

the warnings pragma will warn you of this. :-)

You'd never do something like @foo = 6, 7, 8 though. It wouldn't be 
practical for Perl to try to work out every case of "weirdness" and 
report a syntax error, since it's not a definition, just weirdness. 
That's what warnings is for though, but warnings is also not just for 
syntax-weirdness like this, but to help spot bugs where you *think* a 
value has been filled when really it's not etc.


More information about the Edinburgh-pm mailing list