# this would be much easier in Perl 6 sub unpack_fields { my $record = shift; my @var; my $template = join " ", map { my ($field, $width) = splice @_, 0, 2; push @var, $field if ref $field; ( ref $field ? 'A' : 'x' ) . $width; } 0 .. $#_ / 2; my @value = unpack $template, $record; ${ shift @var } = shift @value while @value; }