use strict; package Bit; use Tie::Scalar; sub TIESCALAR { my ($self) = bless {}, shift; $self->{ref} = shift; $self->{mask} = shift; $self->{bit} = 0; return $self unless $self->{mask}; # mask can't be zero my $tmp = $self->{mask}; while ( !($tmp & 1)) { $tmp >>= 1; $self->{bit} ++; } return $self; } sub FETCH { my $self = shift; return ( ${$self->{ref}} & $self->{mask} ) >> $self->{bit} ; } sub STORE { my $self = shift; my $value = shift; ${$self->{ref}} |= $self->{mask}; ${$self->{ref}} ^= $self->{mask}; ${$self->{ref}} |= $self->{mask} & ($value << $self->{bit}); } #--------------------- my $bits = 0; # a "n-bits" variable tie my $a, 'Bit', \$bits, 0x07; # bits 0..3 are $a tie my $b, 'Bit', \$bits, 0x70; # bits 4..7 are $b $a = 1; print "$bits\n"; # 1 $b = 1; print "$bits\n"; # 17 $a = 0; print "$bits\n"; # 16