http://www.perlmonks.org?node_id=769844

KSURi has asked for the wisdom of the Perl Monks concerning the following question:

Hello, monks!

There is a simple script:
use Modern::Perl; my $x = 2.3; given($x) { when(int) { say 'match' } # int($_) ~~ $x default { say 'no match' } }
It prints 'no match' as expected.

There is also another script with a little difference:
use Modern::Perl; my $x = 2.3; given($x) { when($_) { say 'match' } # $_ ~~ $x default { say 'no match' } }
Prints 'match' as expected.

The strangeness is that B::Deparse produces the same output for both scripts:
use Modern::Perl; use warnings; use strict 'refs'; BEGIN { $^H{'feature_say'} = q(1); $^H{'feature_state'} = q(1); $^H{'feature_switch'} = q(1); } my $x = 2.3; given ($x) { when ($_) { say 'match'; } default { say 'no match'; } }
Why is this so? Is this a bug of B::Deparse?

Replies are listed 'Best First'.
Re: Strange given/when deparsing
by ikegami (Patriarch) on Jun 09, 2009 at 15:53 UTC

    Is this a bug of B::Deparse?

    Yes, although it *might* have already been fixed in forthcoming 5.10.1.

    You can see the difference with the more precise (but verbose) B::Concise:

    g <2> smartmatch sK*/2 ->h d <0> padsv[$_:46,51] s ->e f <1> int[t4] sK/1 ->g e <0> padsv[$_:46,51] s ->f
    f <2> smartmatch sK*/2 ->g d <0> padsv[$_:46,51] s ->e e <0> padsv[$_:46,51] s ->f

    when(int) { say 'match' } # int($_) ~~ $x

    You have the order backwards. It's $x ~~ int($_). (Well, $_ ~~ int($_) really.)

      Isn't ~~ commutative?
        It might have been. It might be. It won't be.

        Update: Is the following clearer?

        It might have been commutative in the past. It might be commutative now. It won't be commutative in the future.

Re: Strange when/given deparsing
by akho (Hermit) on Jun 09, 2009 at 11:06 UTC
    Very probably. Only perl can parse Perl, after all; and given/when is quite new.