On 31 Oct 2009, at 16:03, B Maqueira wrote:
I need to sort eficiently a large array (~9000) of SNMP OIDs.
I am currently trying the following code:
my @sorted_oids = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { [$_, pack('w*', split(/\./,
$_))] } @oids;
But this fails since it outputs 1.3.6.1.4.1.2333.3.2.61001.1.10 before
than 1.3.6.1.4.1.2333.3.2.8080.1.1.1
Any ideas?
That's because "w" format is a BER encoding, and this does not map
integers into strings such that ordering is maintained. For example,
16383 encodes to "\xff\x7f", but 16384 encodes to "\x81\x80\x00" which
string-sorts earlier.
Relatively few encodings *do* maintain that ordering. Big-endian fixed-
width does. So I'd use "N*" instead in your pack format, mainly
because I'm not entirely sure whether the components of SNMP OIDs can
ever be greater than 65535 and thus whether I could thus get away with
"n*" to halve the storage required.