Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Re: converting from switch to given-when

by Athanasius (Chancellor)
on Sep 25, 2012 at 03:03 UTC ( #995481=note: print w/replies, xml ) Need Help??

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] } } }


12:50 >perl 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 (Abbot) 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'

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://995481]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (8)
As of 2018-06-21 22:29 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (120 votes). Check out past polls.