my %engr_scale = ( k => 10**3, m => 10**6, g => 10**9, t => 10**12, ); sub normalized_net_speed { local $_ = lc shift; s/^T1\b/1.544 mbps/i; s/^([.0-9]+)\s*([kmgt])bps/ int( $1 * $engr_scale{lc $2} ) /e; s/[^.0-9].*$//; # kill non-numeric stuff $_ } my @sorted = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [ $_, normalized_net_speed($_) ] } @array;