On Tue, Apr 03, 2012 at 05:39:10PM -0400, Stan N/A wrote:
> I've run into a weird issue where the ternary operator isn't doing
> what I believe it normally would and need some help understanding the
> issue. I'm sure I'm missing some critical point, but perhaps this is
> an issue with perl. Here's a short 14 line script exemplifying the
> issue:
> 
> -----code-----
> #!/usr/bin/perl
> use strict;
> use warnings;
> 
> my %test = (
>     one => "first",
>     two => "second"
> );
> 
> $test{one} eq "first" ?
>     $test{one} .= " is the worst\n" :
>     $test{two} .= " is the best\n";
> 
> print $_ for values %test;
> ----code----
> 
> I believe the output should result with:
> 
> first is the worst
> second
> 
> The output I receive running this test is:
> 
> first is the worst
>  is the best
> second
> 
> This seems peculiar! Help!

Regardless of whether the ternary operator is "meant" to be used like
this, and aside from questions of style, it is useful to know what is
going on here and to be able to diagnose similar problems.

The problem you are seeing is due to precedence.  You can see from the
table in perlop that ?: has (slightly) higher precedence than .= and
this is what causes this behaviour.

You can check that by running:

 $ perl -MO=Deparse,-p -e '$test{one} eq "first" ? $test{one} .= " is the 
worst\n" : $test{two} .= " is the best\n"'
 ((($test{'one'} eq 'first') ? ($test{'one'} .= " is the worst\n") : 
$test{'two'}) .= " is the best\n");
 -e syntax OK

The -p option to Deparse tells perl to put in parentheses even when they
are not necessary, and in this case it explains the otherwise puzzling
behaviour you have seen.

The other bit of knowledge that might be required is that in Perl
assignment produces an lvalue (meaning you can assign to it).

Parenthetically, ?: also produces an lvalue if both its second and third
arguments are lvalues, which can be useful sometimes.

Most of this, including the specific problem you are seeing, is
documented in perlop under the heading "Conditional Operator".

-- 
Paul Johnson - p...@pjcj.net
http://www.pjcj.net

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to