in reply to Please help with sorting/sort

Here is a memory and CPU optimized version of kyle (++) 's solution:
#! /usr/bin/perl use strict; my @lines = <DATA>; my @matching = map {{IDX=>$_, ID_KEY => ( $lines[$_] =~ /id:\s?(\d+)/ + )}} grep $lines[$_] =~ /id:\s?\d/, 0 .. $#lines; my @sorted_matching = sort { $a->{ID_KEY} <=> $b->{ID_KEY} } @matching; @lines[map {$_->{IDX} } @matching] = @lines[map {$_->{IDX}} @sorted_matching]; print @lines; __DATA__ #Comment *ss id addr id: 099 bbb ccc aaa *ss id addr id: 003 aaa bbb ccc #Comment 2 *333 23 ss id: 002 aaa bbb ccc *22 233333333 34432 233 44
Memory is optimized because this avoids copying the entire $line[$_] for sort purposes. Instead, it copies only the extracted sort key, and index. Since the regular-expression for extracting the sort key is performed only once per record (instead of on each compare on the sort), CPU is optimized.

I would be the first to admit that this probably classic "premature optimization" if the data size and frequency of use is small, but it was fun.

     "As you get older three things happen. The first is your memory goes, and I can't remember the other two... " - Sir Norman Wisdom