in reply to Re^3: Mr. Ternary is greater than Mrs. If Else
in thread Mr. Ternary is greater than Mrs. If Else

Consider
perl -le 'use strict; my $foo = 1; $foo ? \&{print "foo"} : \&{ print +"bar"};' foo

Inside a ternary ?: the expressions are evaluated - and \& { } constructs a code ref block which gets evaluated at runtime, to get at the name of the symbol table entry CODE slot from which a reference is taken.

perl -MO=Concise,-exec -le '$foo = 1; $foo ? \&{print "foo"} : \&{ pri +nt "bar"};' 1 <0> enter 2 <;> nextstate(main 1 -e:1) v 3 <$> const[IV 1] s 4 <#> gvsv[*foo] s 5 <2> sassign vKS/2 6 <;> nextstate(main 3 -e:1) v 7 <#> gvsv[*foo] s 8 <|> cond_expr(other->9) vK/1 9 <0> pushmark sRM a <0> pushmark s b <$> const[PV "foo"] s c <@> print sK d <1> rv2cv[t3] lKRM/AMPER,33 <---- here e <1> refgen vK/1 goto f g <0> pushmark sRM h <0> pushmark s i <$> const[PV "bar"] s j <@> print sK k <1> rv2cv[t4] lKRM/AMPER,33 <---- and here l <1> refgen vK/1 f <@> leave[1 ref] vKP/REFC -e syntax OK

<update>

For the bare \& { } try e.g.

perl -le 'use strict; my $foo = \&{ print "bar"}; $foo'

</update>

--shmem

_($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                              /\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

Replies are listed 'Best First'.
Re^5: Mr. Ternary is greater than Mrs. If Else
by blazar (Canon) on May 20, 2007 at 12:13 UTC
    Inside a ternary ?: the expressions are evaluated - and \& { } constructs a code ref block which gets evaluated at runtime, to get at the name of the symbol table entry CODE slot from which a reference is taken.

    This literally answers my question, and indeed I had realized myself after posting. Anyway I would consider this the "most side-effectish hack abuse one may have imagined for such a thing". This is certainly silly: one thing either has side effects or not, but... well to mangle the sybol table just to execute a block is... err... well... just as bad™ as I can imagine!