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


in reply to converting from switch to given-when

It seems to be something to do with (de)referencing the constant.

Actually, running with perl -MO=Deparse shows that wxID_Yes, wxID_No, and wxID_CANCEL are subroutines:

given ($selection) { when (wxID_YES()) { print qq[You pressed: "Yes"\n]; } when (wxID_NO()) { print qq[You pressed: "No"\n]; } when (wxID_CANCEL()) { print qq[You pressed: "Cancel"\n]; } }

And the documentation says that “A user-defined subroutine call or a method invocation” is treated as a boolean, meaning “true” if it returns any non-zero value! (You can easily confirm this by making your own subroutines that return 0 and 1, say, and you will see that the first when clause with the non-zero-returning sub is always successful.)

Update: Here’s the code I used for experimenting:

#! perl use v5.14.1; use strict; use warnings; use Wx qw(wxID_YES wxID_NO wxID_CANCEL); sub ZERO { 0 } sub ONE { 1 } { my $selection = wxID_NO; print "selection is $selection\n"; print 'wxID_YES is ', wxID_YES(), "\n"; given ($selection) { when (ZERO) { print qq[Zero\n] } when (ONE) { print qq[One\n] } when (wxID_YES) { print qq[You pressed: "Yes"\n] } when (wxID_NO) { print qq[You pressed: "No"\n] } when (wxID_CANCEL) { print qq[You pressed: "Cancel"\n] } default { print qq[Invalid selection\n] } } }

Output:

12:50 >perl 300_SoPW.pl selection is 5104 wxID_YES is 5103 One

So, it looks as though this (strange) behaviour is exactly as expected (until changed in a later version of Perl?) In the meantime, either of the workarounds you suggest will get the job done. I haven’t found a “simpler/cleaner syntax.” :-(

Hope that helps,

Athanasius <°(((><contra mundum

Replies are listed 'Best First'.
Re^2: converting from switch to given-when
by tobyink (Canon) on Sep 25, 2012 at 06:05 UTC

    Indeed. If they were proper constants (e.g. defined by constant) then they'd work with given/when. But they are not. :-(

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'