our (@fields, %width, $packt); { my @f = ( # list of field names and widths in the order in which they appear li => 2, vn => 3, mode => 3, (map {$_ => 8} qw(stratum poll_interval precision)), (map {$_ => 32} qw(root_delay dispersion identifier)), (map {$_ => 64} qw(ref_epoch originate_epoch receive_epoch transmit_epoch)) ); @fields = map {$f[$_*2]} (0 .. @f/2); %width = (@f); $packt = join '', map {"a$width{$_}"} @fields; } ... %srv = (); @srv{@fields} = map { oct("0b".$_) } unpack $packt, $received_data;