sub unpack2hash { my ($template, $source) = @_; my $hash = {}; foreach(split / /,$template) { my ($temp,$type,$var) = split /:(.)/; if($type eq '@') { my @r = unpack $temp, $source; $hash->{$var} = \@r; my $pack = pack $temp, @r; substr $source, 0, length $pack, ''; }elsif($type eq '$') { my $r = unpack $temp, $source; $hash->{$var} = $r; my $pack = pack $temp, $r; substr $source, 0, length $pack, ''; } else{ die "need context type\n" } } return $hash; }