On Nov 11, 11:27 pm, c...@pobox.com (Chap Harrison) wrote:
> I'm almost embarrassed to ask this, but I can't figure out a simple way to 
> construct a switch ('given') statement where the 'when' clauses involve 
> bit-testing.
>
> Here's the only way I've figured out to build a switch statement that does 
> the trick.  It seems unusually wordy, which makes me think there must be a 
> simpler way to test for certain bit combinations.  Any suggestions?
>
> Thanks,
> Chap
>
> #!/usr/bin/perl                                                               
>                                                                               
>                                              
>
> use strict;
> use warnings;
> use feature ":5.10";
>
> # Here are masks for various bit combos of interest:                          
>                                                                               
>                                               
>
> my $one_three        = 0b00001010; # bits 1 and 3 (counting from 0, right to 
> left)                                                                         
>                                                
> my $zero_four        = 0b00010001; # bits 0 and 4                             
>                                                                               
>                                              
> my $five             = 0b00100000; # bit 5                                    
>                                                                               
>                                               
>
> # Here we will test several bit fields for bit combos of interest:            
>                                                                               
>                                               
>
> for my $flags ( 0b10111010, 0b10111000, 0b10010010) {
>
>     my $asbits = sprintf("0b%08b", $flags); # prepare bits for 
> pretty-printing                                                               
>                                                              
>
>     given ( $flags ) {
>         when ( ($_ & $one_three) == $one_three ) {  # bits one and three are 
> on                                                                            
>                                               
>             say "$asbits has bits 1 and 3";
>         }
>         when ( ($_ & $zero_four) == $zero_four ) { # bits zero and four are 
> on                                                                            
>                                                 
>             say "$asbits has bits 0 and 4";
>         }
>         when ( ($_ & $five) == $five ) { # bit five is on                     
>                                                                               
>                                              
>             say "$asbits has bit 5";
>         }
>         default {
>             say "$asbits has no interesting bit patterns.";
>         }
>     }
>
> }

Not lots shorter but you could use a closure to hide
the calculation:

my $mask;
for my $flags ( ... ) {
     $mask = sub { return ($flags & $_[0]) == $_[0] }
            unless $mask;
     given( $flags ) {
            when ( $mask->($one_and_three)  ) { ... }
            when ( $mask->($zero_and_four)   ) { ... }
            ...
     }
}

--
Charles DeRykus

Reply via email to