use Tie::File; tie my @file, 'Tie::File', $filename or die "tie failed"; @file = map {$$_[0]} sort { $$a[1] cmp $$b[1] } map { /^\\bibitem\{.+?\}\s*(.+)$/; [$_, $1] } @file; untie @file;