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


in reply to Re: Smart enough for Smart Match??? (was "Understanding ...Given/When" )
in thread Understanding the benefit of Given/When ...

Have a look at the last code in the OP (I updated it 10 minutes after posting)

given(@array) and given(\@array) both produce the same ref in $_, but the smartmatch doesn't work as documented.

While I can understand why to limit given to simple scalars I think the docs should either be updated to reflect this behaviour or it's a bug.

UPDATE: you should add continues to se which clauses are true

my @a=('abc',1); given (@a) { when (/abc/ ) { print "abc\n" ;continue} when (1 ) { print "#\n" ;continue} when (['abc',1]) { print "copy\n" ;continue} when (\@a ) { print "self\n" } }

OUTPUT

Argument "abc" isn't numeric in smart match at /home/lanx/tmp/ike_give +n.pl line 9. # copy self

Cheers Rolf

Replies are listed 'Best First'.
Re^3: Smart enough for Smart Match??? (was "Understanding ...Given/When" )
by ikegami (Patriarch) on Mar 04, 2010 at 18:04 UTC

    given(@array) and given(\@array) both produce the same ref in $_

    That's fine. ARRAY means array or array ref.

    I didn't get a chance to read the thread JavaFan started, but I gotta go for a bit now.

      extending your code shows that there is a bug when matching ARRAY ~~ REGEX, do you agree?

      use 5.010; use strict; use warnings; my @a=('abc',1); given (@a) { when (/abc/ ) { print '/abc/'."\n" ;continue} when ("abc" ) { print "abc\n" ;continue} #when (1 ) { print "#\n" ;continue} when (['abc',1]) { print "copy\n" ;continue} when (\@a ) { print "self\n" } } print "as it should be: ",@a~~/abc/;

      OUTPUT

      abc copy self as it should be 1

      Cheers Rolf

      PS: I have to go, too ...

        You need to do when (qr/abc/). when(/abc/) appears to do when($_ ~~ ($_ =~ /abc/)).
        use 5.010; use strict; use warnings; my @a=qw(abc def); given (@a) { when (/abc/ ) { say '/abc/'; continue; } when (qr/abc/) { say 'qr/abc/'; continue; } } say '--'; if (@a ~~ /abc/ ) { say '/abc/'; } if (@a ~~ qr/abc/) { say 'qr/abc/'; }
        qr/abc/ -- /abc/ qr/abc/
        The discrepency is odd, though.