sub BitStream::make_bitstream { my $filename = shift; open my $fh, ... or return my $buf=''; return sub { # if a buffer is available, use it my $ret_str = substr($buf, 0, (defined($_[0]) ? $_[0] : 1), ''); # fill buffer if request may not have been satisfied if (!length($buf)) { my $need = (defined($_[0]) ? $_[0] : 1) - length($ret_Str); return $ret_str if !$need; read from $fh and unpack into $buf $ret_str .= substr($buf, 0, $need, ''); } $ret_str; } } #example package main; $get_bits = BitStream::make_bitstring("foo.dat") or die "open failure: $!"; $onebit = $get_bits->(); $twobits = $get_bits->(2);