# untested use Sort::Key::Radix qw(ikeysort); my $packed_data = do { local $/; <$fh> }; my $last = length($packed_data) / 8 - 1; my @sorted_ix = ikeysort { unpack I => substr($packed_data, $_ * 8, 4) } 0..$last; # now iterating over @sorted_ix, you get the data sorted by Id: for my $ix (@sorted_ix) { my ($id, $val) = unpack II => substr($packed_data, $_ * 8, 8); print "id: $id, val: $val\n" }