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