Here's a solution using the so-called Schwartzian transform
for sorting the keys (the leading "C" is stripped off, and the the key list is sorted by the number before the dash, and then by the number after the dash:
#!/usr/bin/perl
use warnings;
use strict;
my %keys;
$keys{'C10'}->{'C10-1'}=1;
$keys{'C10'}->{'C10-2'}=1;
$keys{'C10'}->{'C10-20'}=1;
$keys{'C10'}->{'C10-3'}=1;
$keys{'C200'}->{'C200-1'}=1;
$keys{'C200'}->{'C200-20'}=1;
$keys{'C200'}->{'C200-3'}=1;
$keys{'C200'}->{'C200-21'}=1;
$keys{'C30'}->{'C30-1'}=1;
$keys{'C30'}->{'C30-2'}=1;
$keys{'C30'}->{'C30-30'}=1;
$keys{'C30'}->{'C30-4'}=1;
sub sorted {
return map { $_->[0] }
sort {
$a->[1] <=> $b->[1] ||
$a->[2] <=> $b->[2]
} map { [ $_, split("-", substr($_,1)) ] } @_;
}
foreach my $key (sorted(keys %keys)) {
print "'$key' => ", $keys{$key}, "\n";
foreach my $subkey (sorted(keys %{$keys{$key}})) {
print " '$subkey' => $keys{$key}->{$subkey}\n";
}
}
Arjen |